在R中合并数据

在R中合并数据,r,merge,R,Merge,我有一个数据集a paper_id author_id 1 521630 1 1611750 2 9 3 627950 4 1456512 8 15 ........ 和数据集B author_id author_name author_affiliation 9 Ernest Jordan Cambridge

我有一个数据集a

paper_id author_id
  1       521630
  1       1611750
  2       9
  3       627950
  4       1456512
  8       15
  ........
和数据集B

author_id    author_name        author_affiliation
    9       Ernest Jordan            Cambridge                                                    
    14         K. MORIBE               NA                                                 
    15     D. Jakominich               NA                                                 
    25     William H. Nailon                                                                
    37     P. B. Littlewood    Cavendish Laboratory|Cambridge University 
    ........       
我希望以这样的方式合并这两个数据集,以便通过author_id进行合并,但结果应如下所示:

paper id    author_id        author_name     author_affiliation
  2            9             Ernest Jordan     Cambridge
  8            15            D. Jakominich       NA
也就是说,我只希望按纸张id的顺序保存数据,并对作者id执行合并,这样所有纸张id的顺序都不会受到干扰

我现在做的是:

b<-merge(A,B,by="author_id")
然后我必须通过对paper_id列进行排序来对输出进行排序。这是一种非常低效的方法

这怎么可能呢

谢谢你的评论,时间太长了

我确实得到了你想要的:

A <- read.table(text="paper_id author_id
1       521630
1       1611750
2       9
3       627950
4       1456512
8       15", header=T)

B <- read.table(text="author_id  author_name author_affiliation
9       Ernest_Jordan            Cambridge
14         K._MORIBE               NA
15     D._Jakominich               NA
25     William_H._Nailon           NA
37     P._B._Littlewood    Cavendish_Laboratory|Cambridge_University", 
header=T)

b <- merge(A, B, by="author_id")
b
#   author_id paper_id   author_name author_affiliation
# 1         9        2 Ernest_Jordan          Cambridge
# 2        15        8 D._Jakominich               <NA>

A这应该是你想要的

b <-merge(A,B,by="author_id", sort=F)
b <- b[,c(2,1,3,4)]
与排序(…)
不同,在数据表中设置键使用基数算法“按引用”排序。按引用排序意味着在内存中重新排列行,而不是将整个表复制到新表中。因此,对数据表进行排序的速度非常快,内存效率也非常高


另外,使用
A[B,…]
进行合并比合并两个数据帧要快得多。另外,这个过程将新的列附加到一个(而不是创建一个AS的副本),如<代码>合并(…)> />代码>

如果您可以考虑非代码>基础< /COD>备选方案,那么您可以尝试<代码> PLYR 等价的<代码>合并< /代码>:<代码>连接< /代码>。在
?join
与merge不同,无论使用何种连接类型,都会保留x的顺序。
。列的顺序也会保留

library(plyr)
join(A, B, type = "inner")
# Joining by: author_id
#   paper_id author_id  author_name author_affiliation
# 1        2         9 ErnestJordan          Cambridge
# 2        8        15   Jakominich               <NA>

什么是低效的?合并后对数据进行排序?我不确定您当前输出的问题是什么您可以对数据进行重新排序:
b[order(b$paper\u id),]
。好的,谢谢。我只是想知道是否有更好的方法我看不到(如下)您需要对结果重新排序。请澄清您的问题。您可以将参数
sort=FALSE
指定为
merge
,结果数据将不会基于
by
列进行排序。但是,行将“按未指定的顺序”有关更多上下文信息,请参见帮助页面的
部分,以了解
合并
。请注意
sort=FALSE
不能保证
b
的顺序与
A
(或
b
)相同;有文件证明订单未指定。因此,您仍然需要
b@BrianDiggs-你说得对。但在OP的情况下似乎确实有效。请参见编辑。
# create an example
A <- data.frame(paper_id=1:10000, author_id=rev(LETTERS[1:4]))
B <- data.frame(author_id=LETTERS[1:4],
                author_name=c("Davies","Hawking","Carlyle","Higgs"),
                author_affiliation=c("Oxford","Cambridge","UCL","Edinburgh"),
                stringsAsFactors=F)

library(data.table)
A <- data.table(A,key="author_id")
B <- data.table(B,key="author_id")
A[B,c("author_name","author_affiliation"):=list(author_name,author_affiliation)]
setkey(A,paper_id)
head(A)
#    paper_id author_id author_name author_affiliation
# 1:        1         D       Higgs          Edinburgh
# 2:        2         C     Carlyle                UCL
# 3:        3         B     Hawking          Cambridge
# 4:        4         A      Davies             Oxford
# 5:        5         D       Higgs          Edinburgh
# 6:        6         C     Carlyle                UCL
library(plyr)
join(A, B, type = "inner")
# Joining by: author_id
#   paper_id author_id  author_name author_affiliation
# 1        2         9 ErnestJordan          Cambridge
# 2        8        15   Jakominich               <NA>
library(dplyr)
inner_join(x = A, y = B)
# Joining by: "author_id"
#   paper_id author_id author_affiliation  author_name
# 1        2         9          Cambridge ErnestJordan
# 2        8        15               <NA>   Jakominich