在R中查找两个数据框之间的共同ID。

3
有以下数据框:
id1<-c(1,2,3,4,5)
spent<-c(10,20,30,40,50)
id2<-c(1,3,4)
x<-c(1,2,2)
df1<-data.frame(id1,spent)
df2<-data.frame(id2,x)

我需要在df1中找到与df2相同的id,并将它们的所有信息导出到一个新的数据框(df3)中。根据这个基础,df3应该如下所示:
   id1     spent
   1         10
   3         30
   4         40

如果您能帮我解决这个问题,我将不胜感激。


-1 重复:https://dev59.com/22DVa4cB1Zd3GeqPdnes - Kay
2个回答

8

使用merge函数,参见?merge获取有关by.xby.y参数的信息

merge(df1, df2, by.x="id1", by.y="id2")[,-3] # this is the desired output you showed
  id1 spent
1   1    10
2   3    30
3   4    40

merge(df1, df2, by.x="id1", by.y="id2") # this is with "all their information"
  id1 spent x
1   1    10 1
2   3    30 2
3   4    40 2

6
你可以使用 data.table 包,如果你要合并很多 ID,则可能比使用 merge 更快。例如:
library(data.table)

dt1 <- data.table(id1, spent, key = "id1")

dt1[J(unique(df2$id2))]
#    id1 spent
# 1:   1    10
# 2:   3    30
# 3:   4    40

注意:unique可能也不是必要的,但我将其包含在内,以防实际数据包括重复的id2

编辑J()是必需的,此外请参见Matthew Dowle的评论。


J()是必需的,否则它将按行号查找而不是列内容。 J()(或.()等)在字符输入时只是可选的,但在数字输入时需要。向人们指出使用merge()可能更容易,但在data.table上使用merge()可以提高速度。这可能比需要学习J()等更容易地引入data.tablemerge.data.table方法在v1.8.0+中比以前快得多,在许多情况下与X[Y]一样快。 - Matt Dowle

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