data.table的:=与dplyr的mutate差异及高效分组连接实现问题
关于data.table实现同组人员关联列表的性能与结果一致性问题
示例数据
example <- data.table( person_id = c("A1", "A1", "A1", "A1", "A2", "A2", "A3", "A3", "B1", "B1", "C1", "C1", "C2", "C2"), year = c(2015, 2016, 2015, 2016, 2015, 2016, 2015, 2016, 2015, 2016, 2015, 2016, 2015, 2016), group_id = c("abc", "abc", "cdz", "cdz", "abc", "abc", "ghe", "ghe", "abc", "fjx", "ghe", "ghe", "cdz", "cdz") )
需求说明
为每个person_id生成特定年份下,与其同组的其他人员列表。
现有实现问题
当前使用dplyr的代码可实现需求,但在数十亿行的大数据集下运行极慢:
res <- example %>% group_by(year, group_id) %>% mutate(connections = list(person_id)) %>% group_by(year, person_id) %>% summarise(connections = toString(setdiff(unlist(connections), person_id)))
尝试改用性能更优的data.table分组代码,却无法得到与上述dplyr代码一致的结果,现提出两个问题:
- 两段代码结果不一致的原因是什么?
- 如何修改data.table代码使其与dplyr代码结果一致?或是否有更高效的实现方式?
注:使用R版本3.4.3,无法安装tidyverse。
内容的提问来源于stack exchange,提问作者sla813
相关产品推荐
相关产品推荐

