2017-04-27 97 views
0

我已经2级的DF的R - rbind两个数据帧,并删除多余的ID

> df1 
id type 
1 a 
2 b 
3 f 
4 t 
5 y 

> df2 
id type 
1 D 
2 V 
3 f 
4 t 
5 y 
6 z 
7 p 
8 x 

我希望得到以下输出

id type 
1 a 
2 b 
3 f 
4 t 
5 y 
1 D 
2 V 
3 f 
4 t 
5 y 

基本上,我想加盟(rbind)的DF并删除两个DF中不存在的ID。

这里
+1

一次的答案已经给出了,因为你可能会使这些问题的答案你不应该改变你的数据就变得很重要。 –

+0

我知道,但我只改变DF中的列名。我只是认为有一些误解 –

+1

不,我没有改变你的数据,这个事实在编辑历史中是完全可见的,我猜你认为它并不是公开可见的。 – Frank

回答

1

一种策略是取这两个数据帧之间的ID的内积,然后rbind()剩余ba列组合在一起:

df <- merge(df1, df2, by="id") 
rbind(df[,c("id", "b")], setNames(df, c("id", "z", "b"))[, c("id", "b")]) 

输出:

id b 
1 1 a 
2 2 b 
3 3 f 
4 4 t 
5 5 y 
6 1 D 
7 2 V 
8 3 f 
9 4 t 
10 5 y 

使用的数据:

df1 <- data.frame(id=c(1:5), b=c('a', 'b', 'f', 't', 'y')) 
df2 <- data.frame(id=c(1:8), a=c('D', 'V', 'f', 't', 'y', 'z', 'p', 'x')) 
+0

@Frank你改变问题的原始数据。我现在正在改变它。 –

+0

@TimBiegeleisen你为什么改变问题中的列名? –

+0

@TomHart我认为你最初在弗兰克编辑之前有不同的列名。无论如何,这并不会使我的答案无效。选择未定义列 –

0

考虑您的输入作为df1df2,你可以尝试:

library(dplyr) 
library(tidyr) 

df1 %>% 
    inner_join(df2, by = "id") %>% 
    gather(key = eh, value = meh, -id) %>% 
    select(id, meh) 

这给:

id meh 
1 1 a 
2 2 b 
3 3 f 
4 4 t 
5 5 y 
6 1 D 
7 2 V 
8 3 f 
9 4 t 
10 5 y 

附:新列名,它指定by参数为join

+0

是真的。相信现在已经修复了。谢谢! – Aramis7d