This question already has answers here:
Collapse / concatenate / aggregate a column to a single comma separated string within each group
(4 个回答)
3年前关闭。
我想要一个数据。我的数据 A 看起来像
我想要的输出是:
即 paper_id 是按照概率降序排列的。
如果我使用 sql 和 R 的组合,我认为解决方案是
然后在 R 中使用 paste 一旦为 paper_id 设置了顺序。
但我需要 R 中的完整解决方案。这怎么可能呢?
谢谢
编辑:8/11/2014
由于
顺便说一句,这整个事情也可以用基础 R 轻松完成(尽管不推荐用于大数据集)
(4 个回答)
3年前关闭。
我想要一个数据。我的数据 A 看起来像
author_id paper_id prob
731 24943 1
731 24943 1
731 688974 1
731 964345 .8
731 1201905 .9
731 1267992 1
736 249 .2
736 6889 1
736 94345 .7
736 1201905 .9
736 126992 .8
我想要的输出是:
author_id paper_id
731 24943,24943,688974,1201905,964345
736 6889,1201945,126992,94345,249
即 paper_id 是按照概率降序排列的。
如果我使用 sql 和 R 的组合,我认为解决方案是
statement<-"select * from A
GROUP BY author_id
ORDER BY prob"
然后在 R 中使用 paste 一旦为 paper_id 设置了顺序。
但我需要 R 中的完整解决方案。这怎么可能呢?
谢谢
最佳答案
如果 temp
是您的数据集,则执行
library(data.table)
setDT(temp)[order(-prob), list(paper_id = paste0(paper_id, collapse=", ")), by = author_id]
## author_id paper_id
## 1: 731 24943, 24943, 688974, 1267992, 1201905, 964345
## 2: 736 6889, 1201905, 126992, 94345, 249
编辑:8/11/2014
由于
data.table
v >= 1.9.4,您可以使用非常高效的 setorder
而不是 order
str(temp)
setorder(setDT(temp), -prob)[, list(paper_id = paste0(paper_id, collapse=", ")), by = author_id]
## author_id paper_id
## 1: 731 24943, 24943, 688974, 1267992, 1201905, 964345
## 2: 736 6889, 1201905, 126992, 94345, 249
顺便说一句,这整个事情也可以用基础 R 轻松完成(尽管不推荐用于大数据集)
aggregate(paper_id ~ author_id, temp[order(-temp$prob), ], paste, collapse = ", ")
# author_id paper_id
# 1 731 24943, 24943, 688974, 1267992, 1201905, 964345
# 2 736 6889, 1201905, 126992, 94345, 249
关于r - 按组按降序连接值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22685896/
10-12 17:23