Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如果一个数据帧中的行出现在另一个数据帧中,则替换这些行_R - Fatal编程技术网

R 如果一个数据帧中的行出现在另一个数据帧中,则替换这些行

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中

我有以下两个数据帧:

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中的特定值来实现的。同样,通过指定要替换的实际值来回答。我真正的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