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

6

示例:

这里有一张名为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大于2的值?

colA等于"b"时,是否存在colB大于3的值?

colA等于"c"时,是否存在colB大于4的值?

我创建了一个向量arg来保存"group a"、"group b"和"group c"的参数:

arg <- c(2,3,4)

有没有简单的方法将arg传递给按colA分组的dt

这是我想要的结果:

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

这是我在这里的第一个问题,我尝试让它简单明了。提前谢谢。

3个回答

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

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

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)]

它有效!指出mapply是很好的。让我们看看是否有更简单的解决方案。 - user3724375

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接