在R中合并数据
我有一个数据集a在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
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