合并具有不同尺寸的两个数据帧,并在R中进行部分覆盖

时间:2017-09-16 01:32:37

标签: r dataframe merge

我花了一天的大部分时间,但我一直陷入困境。这不会花很长时间在Excel中使用索引匹配匹配,但我对R更新并且合并数据似乎不是很直接。我搜索过该网站并发现了类似的问题,但没有特定于此类问题的解决方案。

我有两个数据框。它们在两个维度上具有不同的长度。 Definition fold_AOrd a1 a2 (v : a1 <= a2) : AOrd a1 a2 := v. Definition fold_BOrd `{OrderR A} (a1 a2 : B) (v : a1 <= a2) : BOrd a1 a2 := v. Hint Resolve fold_AOrd fold_BOrd. 为4x4,a为3x3。它们部分重叠:

b

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

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

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

如您所见,最终数据框合并了两个,并将NA分配给缺失的信息。在“C”列中,我希望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 覆盖b,其中包含数值。在此示例中,a中的值应从44更改为22。

这大部分都很简单。但让“C”列正确是一场噩梦。我先做了一件简单的事情:

c[4,3]

这几乎可以解决问题,但最终会出现重复的行“C”:

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

如果我能找到如何正确合并重复的行,那就不会那么糟糕因为那样我就可以运行

  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

合并其他所有内容,然后在事后引入合并的“C”。

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

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

必须有办法。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

对于将来关注此事的其他人,我意识到这也可以通过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()和{{1}内的变量使用上面的语法在select()中更直接。

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

答案 1 :(得分:1)

试试这个

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