示例:
这是一个名为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
这是我的第一个问题,我试图让它变得简单。提前谢谢。
答案 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)]