在R中使用部分覆盖合并两个不同维度的数据帧

在R中使用部分覆盖合并两个不同维度的数据帧,r,dataframe,merge,R,Dataframe,Merge,我花了一天的大部分时间在这上面,但我一直被卡住。在Excel中使用索引匹配不会花费我很长时间,但我对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

我花了一天的大部分时间在这上面,但我一直被卡住。在Excel中使用索引匹配不会花费我很长时间,但我对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
它几乎做到了这一点,但最终导致重复的行Cs:

  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
一定有办法的

谢谢你的帮助

试试这个

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
试试这个

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

对于将来关注这一点的其他人,我意识到这也可以通过在base中使用以下方法而不是dplyr来解决:

这最终成为了我使用的方法,因为在这条路上,我需要执行一些步骤,对于使用mutate and select内部变量的新手来说,使用dplyr非常困难,而使用上述语法在base中要简单得多


再次感谢CPak,没有CPak,我无法解决这一问题。

对于将来关注这一问题的其他人,我意识到,在base中使用以下方法而不是dplyr也可以解决这一问题:

这最终成为了我使用的方法,因为在这条路上,我需要执行一些步骤,对于使用mutate and select内部变量的新手来说,使用dplyr非常困难,而使用上述语法在base中要简单得多


再次感谢CPak,如果没有他,我无法理解这一点。

BTW,上面的数据帧就是示例,您可能已经意识到了这一点。我试图合并的实际数据帧大约是2000x100和200x20,因此手动更改单个元素没有帮助。顺便说一句,上面的数据帧是示例,您可能已经意识到了这一点。我试图合并的实际数据帧大约是2000x100和200x20,因此手动更改单个元素没有任何帮助。谢谢!这似乎很有效。我最近开始学习dplyr,所以这将帮助我开始理解它。再次感谢。我应该能够根据需要来概括这一点。很好。谢谢!这似乎很有效。我最近开始学习dplyr,所以这将帮助我开始理解它。再次感谢。我应该能够根据需要概括这一点。
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
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
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)))]