按组合并值并按降序排列

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"

当paper_id排序后,在R中使用paste函数。

但我需要完整的R解决方案,应该如何实现?

谢谢。


2
为什么会有相同作者、论文和概率的重复内容?此外,所需格式似乎并不是很有用。您打算将其用于进一步分析吗? - rawr
@rawr-重复项应出现在输出中。输出是最终结果。 - user3171906
1
plyr 有点过头了 - 你可以在基本的 R 中轻松地完成这个任务:with(dat[order(dat$prob , decreasing=TRUE),], aggregate(paper_id , list(author_id=author_id) , paste , sep=",")) - user20650
@user20650:你的代码运行得非常好,谢谢。 - user3171906
3个回答

10

如果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

编辑:2014年8月11日

自从data.table版本号升至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

4
+1,或稍微简单一点,data.table(df)[order(-prob), paste0(paper_id, collapse=", "), by=author_id] - BrodieG
df = data.table(df)[order(-prob),paste0(paper_id,collapse = ","),by = author_id]; setnames(df,"V1","author_id")df = data.table(df)[按照 author_id 分组,按照 prob 降序排序,将 paper_id 拼接成字符串,用逗号分隔]; 将 "V1" 列重命名为 "author_id" - Henk

6
为了完成这个集合,这里是一个dplyr的答案:
df  <- read.table(header = T, text =
"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") # your dataset

library(dplyr)
df %>%
  group_by(author_id) %>%
  arrange(desc(prob)) %>%
  summarise(paper_id = paste(paper_id, collapse = ", "))

## Source: local data frame [2 x 2]
## 
##   author_id                                       paper_id
## 1       731 24943, 24943, 688974, 1267992, 1201905, 964345
## 2       736              6889, 1201905, 126992, 94345, 249

3
你可以尝试这个。
library('plyr')

subdf <- ddply(sample.df,.(author_id), function(df){
  ord <- order(df$prob,decreasing=T)
  return(data.frame(paper_id=paste(df$paper_id[ord],collapse=',')))
})

subdf 

  author_id                                  paper_id
1       731 24943,24943,688974,1267992,1201905,964345
2       736             6889,1201905,126992,94345,249

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接