dplyr mutate的data.table替代方案?

时间:2015-04-11 22:10:38

标签: r data.table

我正在学习R而我不确定在dplyr或data.table上标准化是否有意义。 Dplyr的语法非常好,但据我所知,它会在每个操作上复制数据帧,这是(或可能是)一个缺点。

我无法弄清楚的一件事是mutate的替代方案。

如果我有

df %>% group_by(foo) %>% mutate(
    bar  = cumsum(baz),
    q    = bar * 3.14)

我能做某事......

df[,c("bar"):=list(cumsum(baz)),by=foo]
df$q <- df$bar*3.14

在data.table中有更好的方法吗?

2 个答案:

答案 0 :(得分:9)

您可以这样做:

# some test data:
df <- data.table(baz = 1:10, foo = c(rep(1, 5), rep(2, 5)))

df[, bar := cumsum(baz), by = foo]
df[, q := bar*3.14]

虽然分为两行,但它非常易读且易于编写。

答案 1 :(得分:4)

使用data.table执行此操作的惯用方法是:

dt[, c("bar", "q") := {
       tmp = cumsum(baz)
       list(tmp, tmp*3.14)
     }, by = foo]

data.table同时评估j表达式,而不是单独评估(故意),因此除非将其存储在变量中,否则不能引用更新的值。

这避免了许多情况下的意外。一个有用的场景是:

dt[, c("a", "b") := list(pmin(a,b), pmax(a,b))]

:=的行为与base相同,只是它通过引用更新输入对象。它不等于mutate