将data.table聚合为一列,并在结果中保留另一个id列

时间:2017-08-21 17:16:34

标签: r data.table

我在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]

然而,它不起作用。还有什么建议吗?谢谢!

1 个答案:

答案 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