data.table 中每组返回多行

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

r2e*_*ans 6

包裹起来.(...)=代替 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)