dplyr mutate的data.table替代方案?

zap*_*pp0 9 r data.table

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

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

如果我有

df %>% group_by(foo) %>% mutate(
    bar  = cumsum(baz),
    q    = bar * 3.14)
Run Code Online (Sandbox Code Playgroud)

我可以做某事

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

有没有更好的方法在data.table中执行此操作?

sth*_*len 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]
Run Code Online (Sandbox Code Playgroud)

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


Aru*_*run 5

这样做的惯用方式data.table是:

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

data.table 同时(而不是有目的地)评估j表达式,因此除非将其存储在变量中,否则无法引用更新后的值。

这样可以避免很多情况下的意外。一种有用的方案是:

dt[, c("a", "b") := list(pmin(a,b), pmax(a,b))]
Run Code Online (Sandbox Code Playgroud)

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