data.table以非交互方式传递“ by”表达式

时间:2019-04-09 07:57:51

标签: r data.table

我想以动态方式在data.table的by中使用多个表达式(不仅仅是列名)

这就是我想要做的:

DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9)
DT[, mean(y), by = .(over4 = v > 4)]

我以为我可以传递带有表达式的字符向量,但这不起作用:

by_expression = c("over4" = "v > 4")
DT[, mean(y), by = by_expression]

有没有一种动态传递表达式的方法?

我已经解决了这个问题,但是如果有多个by条件,这会有点麻烦,然后要在稍后进行by操作之后整理一下

DT[, condition := v > 4, ]
DT[, mean(y), by = condition]

2 个答案:

答案 0 :(得分:2)

传递quote d表达式:

by_expression = quote(.(over4 = v > 4))
DT[, mean(y), by = by_expression]

#    over4   V1
# 1: FALSE 2.75
# 2:  TRUE 3.80

答案 1 :(得分:1)

by_expression <- c("over4" = "v > 4",
                   "over2" = "v > 2")
lapply(by_expression, function(ex) DT[, mean(y), by = .(eval(parse(text = ex)))])

结果:

$over4
   parse   V1
1: FALSE 2.75
2:  TRUE 3.80

$over2
   parse       V1
1: FALSE 2.000000
2:  TRUE 3.714286