这里是数据集的一部分:
w=structure(list(price = c(6250L, 9860L, 14690L, 34350L, 4480L,
23230L, 14785L, 14785L, 6270L, 11530L, 26080L, 208333L, 42920L,
10080L, 45500L, 5798L, 18400L, 5285L)), class = "data.frame", row.names = c(NA,
-18L))
我想找到3西格玛(-3;3(之外的值当任何值都在3西格玛之外时,将其替换为中值。
sapply(w, function(x) replace(x, is.na(x), (x, na.rm=TRUE)))
对我不起作用。
我如何找到3西格玛之外的任何值,并将其替换为中值?
也许你可以试试
within(
w,
price <- replace(
price,
abs(mean(price) - price) > 3 * sd(price),
median(price)
)
)
使得
price
1 6250.0
2 9860.0
3 14690.0
4 34350.0
5 4480.0
6 23230.0
7 14785.0
8 14785.0
9 6270.0
10 11530.0
11 26080.0
12 14737.5
13 42920.0
14 10080.0
15 45500.0
16 5798.0
17 18400.0
18 5285.0
p <- w$price
m <- median(p)
replace(p, p > m + 3*sd(p) | p < m-3*sd(p), m)
您可以使用:
med <- median(w$price, na.rm = TRUE)
w$price[w$price < mean(w$price, na.rm = TRUE) - 3*sd(w$price) | w$price > mean(w$price, na.rm = TRUE) + 3*sd(w$price)] <- med
w