R语言 在data.table中每组返回多行

yjghlzjz  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(135)

是否可以在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

data.table中,这将返回一个错误:

library(data.table)
dt <- setDT(df)
dt[, x := setdiff(x, y), g]

[.data.table(df,,:=(x,intersect(x,y)),g)中的错误:
提供了2个项目,将其分配给“x”列中尺寸为3的组1。RHS长度必须为1(可以使用单个值)或与LHS长度完全匹配。如果您希望“回收”RHS,请显式地使用rep(),以使代码的读者清楚地了解此意图。
无论如何,要获得data.tablereframe等价物?

ego6inou

ego6inou1#

Package 在.(...)中,并使用=代替:=(因为它在.(..)内)。

as.data.table(df)[, .(x = setdiff(x, y)), by = g]
#        g      x
#    <num> <char>
# 1:     1      e
# 2:     2      e
# 3:     2      c

请注意,.(.)实际上只是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]

相关问题