【问题标题】:R Matching String to String per row per columnR将字符串匹配到每行每列的字符串
【发布时间】:2018-03-31 11:13:40
【问题描述】:

对于如下文本数据集,我需要每行返回 True 或 False:

 df<-data.frame(c("blue","green","red"),c("red","green","blue"))
 names(df)<-c("df.x","df.y")
df

   df.x  df.y
1  blue   red
2 green green
3   red  blue

结果需要是 True 或 False 并添加到 data.frame。最简单的方法是什么?

谢谢

【问题讨论】:

  • df$ans &lt;-ifelse(df.x==df.y, TRUE, FASLE)
  • 你想要的条件是 TRUE 还是 FALSE?您应该展示您想要的预期输出。
  • 你可以试试 Reduce('==',df)
  • 说真的只是做df$new &lt;- df$df.x == df$df.y,在这里尝试聪明是绝对没有意义的,do.call 和Reduce 不能概括为超过 2 列所以没有意义,within 正在添加字符和损害可读性并为此使用dplyr 完全是矫枉过正。

标签: r


【解决方案1】:
library(plyr)
library(dplyr)
df <- df %>% mutate(df.equal = ifelse(x == y, "True", "False"))

根据您以后是否想将该数据用作布尔值,您还可以使用...

df <- df %>% mutate(df.equal = ifelse(x == y, TRUE, FALSE))

【讨论】:

  • ifelse(x == y, TRUE, FALSE) 与x == y 相同
【解决方案2】:

使用基础R 和within:

df <- within(df, {
  df.z = df.x == df.y
})
df

这会产生

   df.x  df.y  df.z
1  blue   red FALSE
2 green green  TRUE
3   red  blue FALSE

【讨论】:

    【解决方案3】:

    或者我们可以使用do.call 和==

    df$df.z <-  do.call(`==`, df)
    df$df.z
    #[1] FALSE  TRUE FALSE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多