gpt4 book ai didi

r - 合并两个具有不同维度的数据帧,并在 R 中进行部分覆盖

转载 作者:行者123 更新时间:2023-12-05 02:18:03 24 4
gpt4 key购买 nike

我已经花了一天的大部分时间来解决这个问题,但我一直卡住了。这不会让我在 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

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

如您所见,最终的数据框结合了两者并将 NA 分配给缺失的信息。在“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

一定有办法。

感谢您的帮助!

最佳答案

对于以后看到这个的其他人,我意识到这也可以在 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()) 以及使用上述语法在 base 中更直接。

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

关于r - 合并两个具有不同维度的数据帧,并在 R 中进行部分覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46249256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com