如何在data.table中实现类似dplyr::reframe的分组多行返回功能?
在data.table中实现dplyr::reframe的等价功能
要实现和dplyr::reframe一样的分组返回多行结果的功能,你需要注意data.table中:=是用于修改原数据表的列,要求右侧结果长度必须和分组内原行数匹配——这也是你之前代码报错的核心原因:原分组1有3行,但setdiff(x,y)只返回1个值,无法对应赋值到3行;分组2有4行,返回2个值,同样不匹配。
正确的做法是直接在分组后返回新的结果集,不需要使用:=,代码如下:
# 准备数据 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(data.table) dt <- setDT(df) # 等价于dplyr::reframe的操作 dt[, .(x = setdiff(x, y)), by = g]
执行后会得到和dplyr::reframe完全一致的输出:
g x 1: 1 e 2: 2 e 3: 2 c
原理是:.(x = setdiff(x,y))会让每个分组生成对应长度的新行,最终合并成一个新的data.table,这和reframe按分组聚合并返回多行结果的逻辑完全匹配。
内容的提问来源于stack exchange,提问作者Maël
相关产品推荐
相关产品推荐

