我正在学习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中有更好的方法吗?
答案 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
。