我有以下两个数据框:
DF1
id V1 V2 V3
210 4 NA 7
220 NA NA NA
230 2 0 1
240 4 NA NA
250 1 9 2
260 6 5 NA
270 0 NA 3
DF2
id V1 V2 V3
210 4 3 7
240 4 3 NA
270 0 3 3
df2是df1在V2中具有NA并且在V1或V3中具有至少一个数值的所有实例。在这种情况成立的情况下,我已将V2中的NA更改为“3”。
我现在想把这些dfs重新组合在一起。具体来说,我想替换df2中出现的df1中的所有行。我的预期输出是:
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
我查看了this question,但它是根据df中的具体值来完成的。通过指定要替换的实际值,类似地回答了this question。我真正的df是巨大的,我想要做的就是将两个dfs放在一起,用df2替换两者中出现的行。
答案 0 :(得分:8)
一个简单的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
编辑:
正如@plafort指出的那样,你可以首先避免创建df2
,但我会使用矢量化方法而不是apply
。例如
indx <- rowSums(is.na(df1)) != (ncol(df1) - 1) & is.na(df1$V2)
df1[indx, "V2"] <- 3
答案 1 :(得分:5)
我的匹配语法类似于@DavidArenburg和
df1[df1$id %in% df2$id, ] <- df2
没有必要创建额外的数据框会有帮助吗?如果要创建df2
以填充df1
,您可以快速将3
分配到相应的区域,而无需创建新的数据框。
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