Maë*_*aël 3 grouping r data.table
是否可以在分组命令中为每个组返回多行data.table?在 中dplyr,这是通过以下方式完成的reframe:
y <- c("a", "b", "d", "f")
df <- tibble(
g = c(1, 1, 1, 2, 2, 2, 2),
x = c("e", "a", "b", "e", "f", "c", "a")
)
library(dplyr)
df %>%
reframe(x = setdiff(x, y), .by = g)
# g x
# 1 e
# 2 e
# 2 c
Run Code Online (Sandbox Code Playgroud)
在 中data.table,这会返回一个错误:
library(data.table)
dt <- setDT(df)
dt[, x := setdiff(x, y), g]
Run Code Online (Sandbox Code Playgroud)
[.data.table(df, ,:=(x, intersect(x, y)), g)中的错误:
提供了 2 个项目,将其分配给“x”列中大小为 3 的组 1。右侧长度必须为 1(单个值即可)或与左侧长度完全匹配。如果您希望“回收”RHS,请明确使用rep(),以使代码的读者清楚地了解这一意图。
无论如何要得到data.table相当于reframe?
包裹起来.(...)并=代替 of使用:=(因为它在 内.(..))。
as.data.table(df)[, .(x = setdiff(x, y)), by = g]
# g x
# <num> <char>
# 1: 1 e
# 2: 2 e
# 3: 2 c
Run Code Online (Sandbox Code Playgroud)
请注意,在底层,.(.)实际上只是list(.),所以我们也可以使用任何返回list类似对象的东西,包括:
as.data.table(df)[, list(x = setdiff(x, y)), by = g]
as.data.table(df)[, data.table(x = setdiff(x, y)), by = g]
as.data.table(df)[, data.frame(x = setdiff(x, y)), by = g]
Run Code Online (Sandbox Code Playgroud)