如果数据超过R中的三西格玛,则用中位数替换数据



这里是数据集的一部分:

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

最新更新