R 如果一个数据帧中的行出现在另一个数据帧中,则替换这些行
我有以下两个数据帧: df1 df2 df2是df1在V2中有NA,在V1或V3中至少有一个数值的所有实例。在这种情况下,我已将V2中的NAs更改为“3” 我现在想把这些dfs重新组合起来。具体来说,我想替换df1中出现在df2中的所有行。我的预期输出是:R 如果一个数据帧中的行出现在另一个数据帧中,则替换这些行,r,R,我有以下两个数据帧: df1 df2 df2是df1在V2中有NA,在V1或V3中至少有一个数值的所有实例。在这种情况下,我已将V2中的NAs更改为“3” 我现在想把这些dfs重新组合起来。具体来说,我想替换df1中出现在df2中的所有行。我的预期输出是: id V1 V2 V3 210 4 3 7 220 NA NA NA 230 2 0 1 240 4 3 NA 250 1 9 2 260 6 5 NA 270 0 3 3 我已经看过了,但它是基于df中
id V1 V2 V3
210 4 3 7
220 NA NA NA
230 2 0 1
240 4 3 NA
250 1 9 2
260 6 5 NA
270 0 3 3
我已经看过了,但它是基于df中的特定值来实现的。同样,通过指定要替换的实际值来回答。我真正的df很大,我只想把两个df放在一起,用df2替换两个df中出现的行。一个简单的
match
调用将识别df2$id
中匹配df1$id
的实例(以正确的外观顺序)将解决这个问题
df1[match(df2$id, df1$id), ] <- df2
df1
# id V1 V2 V3
# 1 210 4 3 7
# 2 220 NA NA NA
# 3 230 2 0 1
# 4 240 4 3 NA
# 5 250 1 9 2
# 6 260 6 5 NA
# 7 270 0 3 3
我有一个类似于@DavidArenburg的匹配语法,带有
df1[df1$id %in% df2$id, ] <- df2
有没有办法用dplyr或等效语言实现这一点?@StephanieOwen此解决方案有什么问题?慢吗?难读吗?换句话说,为什么工具比原因更重要?因为我的主管真的很恼火,出于某种原因,他痴迷于我们的实验室小组使用dplyr库和函数进行所有编码,不管它是否有效。解决方案本身没有什么问题dplyr函数通常可读性更强,尽管这是我见过的最优雅的解决方案,因为它很简单。人们总是可以创建一个虚拟变量,并在任务完成时删除它。
df1[match(df2$id, df1$id), ] <- df2
df1
# id V1 V2 V3
# 1 210 4 3 7
# 2 220 NA NA NA
# 3 230 2 0 1
# 4 240 4 3 NA
# 5 250 1 9 2
# 6 260 6 5 NA
# 7 270 0 3 3
indx <- rowSums(is.na(df1)) != (ncol(df1) - 1) & is.na(df1$V2)
df1[indx, "V2"] <- 3
df1[df1$id %in% df2$id, ] <- df2
indx <- apply(df1, 1, function(x) is.na(x[3]) && any(!is.na(x[2:4])))
df1$V2[indx] <- 3
df1
id V1 V2 V3
1 210 4 3 7
2 220 NA NA NA
3 230 2 0 1
4 240 4 3 NA
5 250 1 9 2
6 260 6 5 NA
7 270 0 3 3