如何在 R 中基于键使用 IQR 离群值函数
How to use IQR outlier function, based on a key, in R
我想使用这个 IQR 功能:
smooth_outliers <- function(x, na.rm = TRUE, ...) {
qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
H <- 1.3 * IQR(x, na.rm = na.rm)
y <- x
y[x < (qnt[1] - H)] <- round(qnt[1] - H)
y[x > (qnt[2] + H)] <- round(qnt[2] + H)
y
}
在下面 df
上,在每个特定键的 total
列上,基于 key
列:
key total
US4ZNB 10
US4ZNB 1075
US4ZNB 10000
US4ZNB 1138
US4ZNB 1156
US4YYM 1114
US4YYM 1072
US4YYM 50
US4YYM 1181
US4YYM 8000
JM4YYM 15000
JM4YYM 2000
JM4YYM 100
JM4YYM 2200
JM4YYM 2300
plyr
包中的 ddply
正是这样做的。它将函数应用于基于列的每个数据子集。
plyr::ddply(df, "key", plyr::numcolwise(smooth_outliers))
第一个参数是 "key" 和 "total" 的数据,第二个参数是分组变量,在本例中为 "key".
最后一个变量是您要应用的函数,numcolwise
函数主要用于此处,因此它将它应用于列而不是整行。因此,我们将基于行的平滑离群值函数设为基于列的函数。
然后瞧。
您将获得一个数据框,其中列出每个键及其由 smooth_outliers
函数计算的 IQR。
这是结果。
key total
1 JM4YYM 1421
2 JM4YYM 1712
3 JM4YYM 1709
4 US4YYM 1114
5 US4YYM 1473
6 US4YYM 1181
7 US4YYM 1767
8 US4YYM 1005
9 US4ZAW 1138
10 US4ZAW 1156
11 US4ZAW 1982
12 US4ZNB 1338
13 US4ZNB 1075
14 US4ZNB 1806
如您所见,每个键都与 smooth_outliers 函数的输出之一相匹配。
在想法阐述之后,我设法找到了解决我的问题的方法。我刚用了 dplyr::group_by
:
df.new <- df %>%
group_by(key) %>%
mutate(val=smooth_outliers(total))
谢谢大家
我想使用这个 IQR 功能:
smooth_outliers <- function(x, na.rm = TRUE, ...) {
qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
H <- 1.3 * IQR(x, na.rm = na.rm)
y <- x
y[x < (qnt[1] - H)] <- round(qnt[1] - H)
y[x > (qnt[2] + H)] <- round(qnt[2] + H)
y
}
在下面 df
上,在每个特定键的 total
列上,基于 key
列:
key total
US4ZNB 10
US4ZNB 1075
US4ZNB 10000
US4ZNB 1138
US4ZNB 1156
US4YYM 1114
US4YYM 1072
US4YYM 50
US4YYM 1181
US4YYM 8000
JM4YYM 15000
JM4YYM 2000
JM4YYM 100
JM4YYM 2200
JM4YYM 2300
plyr
包中的 ddply
正是这样做的。它将函数应用于基于列的每个数据子集。
plyr::ddply(df, "key", plyr::numcolwise(smooth_outliers))
第一个参数是 "key" 和 "total" 的数据,第二个参数是分组变量,在本例中为 "key".
最后一个变量是您要应用的函数,numcolwise
函数主要用于此处,因此它将它应用于列而不是整行。因此,我们将基于行的平滑离群值函数设为基于列的函数。
然后瞧。
您将获得一个数据框,其中列出每个键及其由 smooth_outliers
函数计算的 IQR。
这是结果。
key total
1 JM4YYM 1421
2 JM4YYM 1712
3 JM4YYM 1709
4 US4YYM 1114
5 US4YYM 1473
6 US4YYM 1181
7 US4YYM 1767
8 US4YYM 1005
9 US4ZAW 1138
10 US4ZAW 1156
11 US4ZAW 1982
12 US4ZNB 1338
13 US4ZNB 1075
14 US4ZNB 1806
如您所见,每个键都与 smooth_outliers 函数的输出之一相匹配。
在想法阐述之后,我设法找到了解决我的问题的方法。我刚用了 dplyr::group_by
:
df.new <- df %>%
group_by(key) %>%
mutate(val=smooth_outliers(total))
谢谢大家