2017-09-16 80 views
0

我已经花了这一天的更好的一部分,但我一直在卡住。这不会花费我很长时间在Excel中使用索引匹配匹配,但我对R更新,并且合并数据似乎并不直截了当。我搜索了该网站,发现了类似的问题,但没有针对此类问题的解决方案。在R中部分覆盖合并两个不同尺寸的数据帧

我有两个数据帧。它们在两个维度上都有不同的长度。 a是4x4,而b是3x3。部分重叠:

a <- data.frame("ID" = c(1:4), "A" = c(21:24), "B" = c(31:34), "C" = c(41:44)) 
a 

    ID A B C 
1 1 21 31 41 
2 2 22 32 42 
3 3 23 33 43 
4 4 24 34 44 

b <- data.frame("ID" = c(4:6), "C" = c(22:24), "D" = c(32:34)) 
b 
    ID C D 
1 4 22 32 
2 5 23 33 
3 6 24 34 

我合并的 “ID” 号码。我的目标是让他们看起来像

c <- data.frame("ID" = c(1:6), "A" = c(21:24, NA, NA), "B" = c(31:34, NA, NA), "C" = c(41:43,22:24), "D" = c(NA, NA, NA, 32:34)) 
c 

ID A B C D 
1 21 31 41 NA 
2 22 32 42 NA 
3 23 33 43 NA 
4 24 34 22 32 
5 NA NA 23 33 
6 NA NA 24 34 

正如你所看到的,最终的数据帧合并这两个并分配娜缺少的信息。在“C”栏中,我想b覆盖a它有数字值。在这个例子中,在c[4,3]值应该改变从44至22

大多数这是很简单的。但让列“C”正确是一场噩梦。我做了简单的事情第一:

merge(a, b, by = "ID", all = T) 

它几乎是卓有成效的,但与重复行个“C”结束:

ID A B C.x C.y D 
1 1 21 31 41 NA NA 
2 2 22 32 42 NA NA 
3 3 23 33 43 NA NA 
4 4 24 34 44 22 32 
5 5 NA NA NA 23 33 
6 6 NA NA NA 24 34 

这不会是如此糟糕,如果我能找出如何正确合并重复的行,因为这样我可以只运行

merge(a[-4], b[-2], by = "ID", all = T) 
    ID A B D 
1 1 21 31 NA 
2 2 22 32 NA 
3 3 23 33 NA 
4 4 24 34 32 
5 5 NA NA 33 
6 6 NA NA 34 

到别的合并的一切,那么在事后合并的“C”带来的。

但我无法弄清楚如何处理这部分内容:

merge(a[c(1,4)], b[c(1,2)], by = "ID", all = T) 
    ID C.x C.y   ID C 
1 1 41 NA  1 1 41 
2 2 42 NA  2 2 42 
3 3 43 NA -> 3 3 43 
4 4 44 22  4 4 22 
5 5 NA 23  5 5 23 
6 6 NA 24  6 6 24 

有一定有办法。

感谢您的帮助!

+0

顺便说一句,以上的数据帧是例子,你可能会意识到。我试图合并的实际数据框大致为2000x100和200x20,因此手动更改单个元素将无济于事。 – trijamms

回答

0

试试这个

library(dplyr) 
starthere <- merge(a, b, by = "ID", all = T) 
starthere %>% 
    mutate(C = ifelse(is.na(C.y), C.x, C.y)) %>% 
    select(-C.x, -C.y) 


    # ID A B D C 
# 1 1 21 31 NA 41 
# 2 2 22 32 NA 42 
# 3 3 23 33 NA 43 
# 4 4 24 34 32 22 
# 5 5 NA NA 33 23 
# 6 6 NA NA 34 24 
+0

不错。非常感谢!这似乎很好。我最近开始学习dplyr,所以这会帮助我开始理解它。再次感谢。我应该能够将其推广以适应需求。 – trijamms

+0

很高兴帮助... – CPak

0

对于其他人在未来的看着这个,我意识到这也可以解决使用下面的base而不是dplyr

df <- merge(a, b, by = "ID", all = T) 
df[,"C"] <- ifelse(is.na(df[,"C.y"]), df[,"C.x"], df[,"C.y"]) 
df <- df[,-c(match("C.x", names(df)),match("C.y", names(df)))] 

该结束了我使用的方法,因为在路上我才需要执行一些步骤是非常困难的dplyr对于一个新手(利用内幕mutate()select()变量)和更多strai ghtforward使用上述语法在base

再次感谢CPAK,没有他们,我不可能想通了这一点。