我有一个像这样的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中显示的名称。
答案 0 :(得分:2)
使用apply
和ifelse
的解决方案:
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