检查多个列的值,如果在R中找不到则替换为NA

时间:2017-12-08 07:12:15

标签: r

我有一个像这样的data.frame:

#df1
ID     a1      a2     a3      b1      b2      b3     Date    Name
3xy    NA      NA     NA     Ben      Bob     Alex   12/3    Bob
4lm    John    Bill   Sue    NA       NA      NA     12/5    Mark

我想要那些名字""如果列不在其行的任何a1到b3列中出现,则由NA替换,如下所示:

ID     a1      a2     a3      b1      b2      b3     Date    Name
3xy    NA      NA     NA     Ben      Bob     Alex   12/3    Bob
4lm    John    Bill   Sue    NA       NA      NA     12/5    NA

我无法弄清楚为什么以下不起作用:

df1$Name <- with(df1, ifelse(Name %in% df1[2:7], Name, NA))

df1$Name[!(df1$Name %in% df1[2:7])] <- NA

这两个陈述都取代了整个&#34;名称&#34;带有NA的列,无法保留列a1到b3中显示的名称。

3 个答案:

答案 0 :(得分:2)

使用applyifelse的解决方案:

df1$Name <- apply(df1, 1, function(x) ifelse(x[9] %in% x[2:7], x[9], NA))

答案 1 :(得分:2)

也许这个:

df1$Name[!(df1$Name %in% t(df1[, 2:7]))] <- NA

请注意,,之前的2:7以便选择相应的列,并t()转换这些列以使%in%处理向量。< / p>

此解决方案非常接近您的第二种方法。

答案 2 :(得分:1)

我们可以使用rowSums分配&#39;名称&#39;如果每行的任何列中没有TRUE元素,则列为NA

df1$Name[!rowSums(t(t(df1[2:7] ) == df1$Name), na.rm = TRUE)] <- NA