我在R中有一个data.table,它按一列的值分组,并在每个组中找到异常值。但我需要保留id列(不包括在聚合中)。例如,对于下面的数据表a,我想按类找出小时数的异常值,并输出相应的id。
Hours id class
1: 100.000 30298340 M
2: 4.776 30310183 M
3: 1.560 30312576 M
4: 11.520 30336159 M
5: 3.288 30331383 M
6: 6.552 30364533 M
7: 5.064 30365224 M
8: 27.768 30365394 C
9: 4.992 30365211 M
10: 25.536 30365603 M
11: 8.568 30337051 M
12: 5.112 30337052 C
13: 2.352 30284703 M
14: 23.784 30325405 M
15: 16.464 30327152 M
16: 24.336 30351237 M
17: 3.192 30352117 M
18: 24.312 30324926 M
19: 23.160 30325670 M
20: 4.176 30324906 M
然后我使用以下代码来查找异常值。
temp<-a[,.(Hours=boxplot.stats(Hours,coef=3,do.conf=F)$out,M=boxplot.stats(Hours,do.conf=F
)$stats[3]),by=class]
temp [Hours&gt; M]会给出高于中位数和中位数的异常值作为参考。
class Hours M
1: M 100 7.56
但是如何更改聚合线以包含异常值行的ID?
由于我的原始表非常大,我不想将temp与原始数据合并。另外,因为这只是现有大型程序的一小部分,所以我试图保留临时结果的主要结构,并添加了id列,这样temp就可以传递到下一个计算块中。理想情况下,是否有一种简单的方法可以调整data.table聚合行来满足我的要求?谢谢!!!
以下是相同方案中的其他问题。现在,如果我在原始数据中还有3个列,即年龄,性别等。如何将它们全部保留在异常值输出中?我可以简单地重复Eric的代码,将id替换为其他变量,并添加data.table步骤:
age=age[which(Hours %in% boxplot.stats(Hours, coef = 3, do.conf = FALSE)$out)],
gender=gender[which(Hours %in% boxplot.stats(Hours, coef = 3, do.conf = FALSE)$out)],
但如果要添加更多列,这将是一项繁琐的工作。我正在考虑做以下事情:
keyname<-c("age", "gender","id")
temp <- a[, .(Hours = boxplot.stats(Hours, coef = 3, do.conf = FALSE)$out,
M = boxplot.stats(Hours, do.conf = FALSE)$stats[3],
lapply(c(1:length(keyname)),function(x) keyname[x]=get(keyname[x])[which(Hours) %in% boxplot.stats(Hours, coef = 3, do.conf = FALSE)$out)]),
by = class]
然而,它不起作用。还有什么建议吗?谢谢!
答案 0 :(得分:0)
使用which
和子集来制作列。
temp <- a[, .(Hours = boxplot.stats(Hours, coef = 3, do.conf = FALSE)$out,
M = boxplot.stats(Hours, do.conf = FALSE)$stats[3],
id = id[which(Hours %in% boxplot.stats(Hours, coef = 3, do.conf = FALSE)$out)]),
by = class]
> temp
class Hours M id
1: M 100 7.56 30298340
2: C NA 16.44 NA
> temp[Hours > M]
class Hours M id
1: M 100 7.56 30298340