【问题标题】:Check multiple columns for value, replace with NA if not found in R检查多列的值,如果在 R 中找不到,则替换为 NA
【发布时间】:2017-12-08 07:12:15
【问题描述】:

我有一个这样的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

两个语句都用 NA 替换整个“名称”列,未能保留出现在 a1 到 b3 列中的名称。

【问题讨论】:

    标签: r


    【解决方案1】:

    使用applyifelse 的解决方案:

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

    【讨论】:

      【解决方案2】:

      也许是这样的:

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

      注意,,2:7 之前,以便选择适当的列,而 t() 会转置这些列以使 %in% 对向量起作用。

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

      【讨论】:

        【解决方案3】:

        如果每一行的任何列中都没有 TRUE 元素,我们可以使用rowSums 将“名称”列的值分配给 NA

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

        【讨论】:

          猜你喜欢
          • 2020-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-21
          • 2021-12-22
          • 2022-10-04
          • 2014-11-04
          相关资源
          最近更新 更多