如果它们出现在另一个数据框中,则替换一个数据框中的行

时间:2015-06-18 09:54:31

标签: r

我有以下两个数据框:

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替换两者中出现的行。

2 个答案:

答案 0 :(得分:8)

一个简单的match调用将识别df2$iddf1$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