我正在学习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中执行此操作?
你可以这样做:
# 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)
虽然分为两行,但它非常易读且易于编写.
这样做的惯用方式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。
| 归档时间: |
|
| 查看次数: |
6085 次 |
| 最近记录: |