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]

Error in [.data.table(df, , :=(x, intersect(x, y)), g) :
Supplied 2 items to be assigned to group 1 of size 3 in column 'x'. The RHS length must either be 1 (single values are ok) or match the LHS length exactly. If you wish to 'recycle' the RHS please use rep() explicitly to make this intent clear to readers of your code.

不管怎么说,要拿到相当于reframe分的data.table分?

推荐答案

换成.(...),用=代替:=(因为它在.(..)以内).

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]

R相关问答推荐

高质量地将R格式的图表从Word中输出

使用Shiny组合和显示复制和粘贴的数据

使用预定值列表将模拟数量(n)替换为rnorm()

如果列中存在相同的字符串,则对行值进行总和

如何按排序顺序打印一个框架中所有精确的唯一值?

过滤器数据.基于两列的帧行和R中的外部向量

Highcharter多次钻取不起作用,使用不同方法

ggplot的轴标签保存在officer中时被剪切

自动变更列表

使用`Watch()`和`renderUI()`时,不再满足仍出现在SHILINY AFTER条件中的条件输入

根据约束随机填充向量的元素

如何移除GGPlot中超出与面相交的任何格网像元

远离理论值的伽马密度曲线下面积的近似

R中时间间隔的大向量与参考时间间隔的相交

整理曲线图、曲线图和点图

Broom.Mixed::Augment不适用于Sample::分析

具有自定义仓位限制和计数的GGPLATE直方图

conditionPanel不考虑以下条件

打印的.txt文件,将值显示为&Quot;Num&Quot;而不是值

如果缺少时间,如何向日期-时间列添加时间