如何在data.table分组中为每个组传递不同的参数?

时间:2014-06-10 04:11:46

标签: r data.table

示例:

这是一个名为dt的数据表:

> library(data.table)
> dt <- data.table(colA=rep(letters[1:3],each=3), colB=0:8)
> dt
   colA colB
1:    a    0
2:    a    1
3:    a    2
4:    b    3
5:    b    4
6:    b    5
7:    c    6
8:    c    7
9:    c    8

我想知道:

对于colA等于“a”,colB&gt;中是否有任何值? 2?

对于colA等于“b”,colB&gt;中是否有任何值? 3?

对于colA等于“c”,colB&gt;中是否有任何值? 4?

我创建了一个名为arg的向量来保存组“a”,“b”和&amp;组的参数。 “C”:

  

arg&lt; - c(2,3,4)

有人能给我一个简单的方法,将arg传递给dt colA的分组吗?

这是我想要的结果:

     colA    V1
  1:    a FALSE
  2:    b  TRUE
  3:    c  TRUE

这是我的第一个问题,我试图让它变得简单。提前谢谢。

3 个答案:

答案 0 :(得分:9)

对于它所操作的每个子组,[.data.table()将有关分组变量当前值的信息存储在名为.BY的变量中。

如果您首先设置一个命名向量,将分组变量的级别映射到所需的参数值,您可以使用.BY对其进行索引,提取相应的值,如下所示:

arg <- setNames(c(2, 3, 4), c("a", "b", "c"))
arg
# a b c 
# 2 3 4

dt[, any(colB > arg[unlist(.BY)]), by="colA"]
#    colA    V1
# 1:    a FALSE
# 2:    b  TRUE
# 3:    c  TRUE

答案 1 :(得分:3)

dt[ , thresh := (2:4)[as.numeric(factor(colA))] ]
dt

   colA colB thresh
1:    a    0      2
2:    a    1      2
3:    a    2      2
4:    b    3      3
5:    b    4      3
6:    b    5      3
7:    c    6      4
8:    c    7      4
9:    c    8      4

dt[, any(colB > thresh),by=colA]

   colA    V1
1:    a FALSE
2:    b  TRUE
3:    c  TRUE

答案 2 :(得分:1)

可能不是最优雅的方式,但我会试一试......

#List components of each group
ref <- dt[,list(colB.list=list(I(colB))),by=colA][,ord:=.I]

#Feed arguements
ref[,arg:=c(2,3,4)]

#Use comparison function
ref[,V1:=mapply(FUN=function(X,Y){sum(colB.list[[X]]>Y)>0},X=ord,Y=arg)]