我花了一天的大部分时间,但我一直陷入困境。这不会花很长时间在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
必须有办法。
感谢您的帮助!
答案 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