【问题标题】:R Merge Two Dataframes on columns keep columnsR合并列上的两个数据框保留列
【发布时间】:2017-12-24 23:07:07
【问题描述】:

抱歉,如果重复,请告诉我,我很乐意删除。

我正在使用 merge 合并 R 中的两个数据集。

age1 = c(5, 6, 7, 8, 10, 11) 
fname1 = c('david','alan','ben', 'ben', 'richard', 'edd') 
sname1 = c('albert','raymond','albert','pete','raymond', 'alan')
area1 = c('r','t','n','x','z','w')

df1 <- data.frame(age1, fname1, sname1, area1)

age2 = c(5, 9, 10, 3, 4, 0) 
fname2 = c('david','alan','david', 'ben', 'richard', 'edd') 
sname2 = c('albert','edd','albert','pete','raymond', 'alan')
area2 = c('w','z','x','n','t','r')

df2 = data.frame(age2, fname2, sname2, area2)

数据集1:

df1
  age1  fname1  sname1 area1
1    5   david  albert     r
2    6    alan raymond     t
3    7     ben  albert     n
4    8     ben    pete     x
5   10 richard raymond     z
6   11     edd    alan     w

数据集 2

df2
  age2  fname2  sname2 area2
1    5   david  albert     w
2    9    alan     edd     z
3   10   david  albert     x
4    3     ben    pete     n
5    4 richard raymond     t
6    0     edd    alan     r

我在 fnamesname 上合并:

matchkey <- merge(df1, df2, by.x = c("fname1", "sname1"), by.y = c("fname2", "sname2"))
View(matchkey)

输出:

> matchkey
   fname1  sname1 age1 area1 age2 area2
1     ben    pete    8     x    3     n
2   david  albert    5     r    5     w
3   david  albert    5     r   10     x
4     edd    alan   11     w    0     r
5 richard raymond   10     z    4     t

但是,我想保留我已合并的列。我怎样才能做到这一点?我应该使用合并以外的东西吗?

预期输出:

   fname1  sname1 age1 area1  fname2   sname 2age2  area2
1     ben    pete    8     x  ben    pete      3       n
2   david  albert    5     r  david  albert    5       w
3   david  albert    5     r  david  albert    10      x
4     edd    alan   11     w  edd    alan      0       r
5 richard raymond   10     z  richard raymond  4       t

我尝试查看,但没有成功:

How do I combine two data-frames based on two columns?

Combining two dataframes keeping all columns

Merge two dataframes with repeated columns

非常感谢。

【问题讨论】:

  • 之后再添加这些列就很容易了。就像matchkey[c("fname2", "sname2")] &lt;- matchkey[c("fname1", "sname1")],虽然这对我来说似乎是多余的。
  • 按定义要添加的列不是和fname1和sname1完全一样吗?一个快速的解决方案是:matchkey$fname2 &lt;- matchkey$fname1matchkey$sname2 &lt;- matchkey$sname1
  • 为你们俩干杯。我想太多了。感谢您的提示。

标签: r join dataframe merge concatenation


【解决方案1】:

由于合并列在内连接或数据帧之间完全匹配时完全相同,因此只需将新列分配给剩余的列。您可以使用transform() 来做到这一点。下面添加 outer()paste0 的组合来检索所需的列顺序:

matchkey <- transform(merge(df1, df2, by.x = c("fname1", "sname1"), 
                                      by.y = c("fname2", "sname2")),
                      fname2 = fname1, sname2 = sname1)

ordercols <- c(outer(c("fname", "sname", "age", "area"), c(1:2), paste0))
matchkey <- matchkey[ordercols]

matchkey    
#    fname1  sname1 age1 area1  fname2  sname2 age2 area2
# 1     ben    pete    8     x     ben    pete    3     n
# 2   david  albert    5     r   david  albert    5     w
# 3   david  albert    5     r   david  albert   10     x
# 4     edd    alan   11     w     edd    alan    0     r
# 5 richard raymond   10     z richard raymond    4     t

【讨论】:

  • 干杯@Parfait。这样做的好方法,可以扩展到我更大的数据集。谢谢。
  • 太棒了!很高兴能提供帮助。
猜你喜欢
  • 2022-01-25
  • 2021-09-14
  • 2013-02-04
  • 2018-12-10
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多