【问题标题】:grep one pattern over multiple columns在多列上 grep 一个模式
【发布时间】:2018-01-10 19:26:52
【问题描述】:

我正在尝试找出一种方法,让我在 mutate() 的多个列上仅使用一个部分模式的 grepl()。如果一组列中的任何一个包含某个字符串,我想要一个新列将是 TRUE 或 FALSE。

df <- structure(list(ID = c("A1.1234567_10", "A1.1234567_20"), 
                 var1 = c("NORMAL", "NORMAL"), 
                 var2 = c("NORMAL", "NORMAL"), 
                 var3 = c("NORMAL", "NORMAL"), 
                 var4 = c("NORMAL", "NORMAL"), 
                 var5 = c("NORMAL", "NORMAL"), 
                 var6 = c("NORMAL", "NORMAL"), 
                 var7 = c("NORMAL", "ABNORMAL"), 
                 var8 = c("NORMAL", "NORMAL")), 
            .Names = c("ID", "var1", "var2", "var3", "var4", "var5", "var6", "var7", "var8"), 
            class = "data.frame", row.names = c(NA, -2L))

            ID   var1   var2   var3   var4   var5   var6     var7   var8
1 A1.1234567_10 NORMAL NORMAL NORMAL NORMAL NORMAL NORMAL   NORMAL NORMAL
2 A1.1234567_20 NORMAL NORMAL NORMAL NORMAL NORMAL NORMAL ABNORMAL NORMAL

我试过了

df$abnormal %>% mutate( abnormal = ifelse(grepl("abnormal",df[,119:131]) , TRUE, FALSE)))

还有大约 100 件其他事情。我希望最终格式为

             ID   var1   var2   var3   var4   var5   var6     var7   var8    abnormal
1 A1.1234567_10 NORMAL NORMAL NORMAL NORMAL NORMAL NORMAL   NORMAL NORMAL FALSE
2 A1.1234567_20 NORMAL NORMAL NORMAL NORMAL NORMAL NORMAL ABNORMAL NORMAL TRUE

我每次尝试都会出错

【问题讨论】:

  • 几个问题 - 首先,您的示例数据中包含“异常”的数据似乎不一致,但您的代码检查了“可疑”。其次,您真的需要grepl - 我的意思是您需要在字符串中搜索模式,还是相等检查有效?相等性检查会更容易和更有效,但它只适用于完全匹配,即“此主题异常”需要grepl 才能匹配。
  • 但是如果你可以检查是否相等,你可以做df$abnormal = rowSums(select(df, starts_with("var")) == "ABNORMAL") &gt; 0。 (如果您愿意,也可以使用mutate)。
  • @Gregor 嗨,我编辑它说异常。真正的数据框将包含“Suspected_13”或“Suspected_15”或“Suspected_18”之类的内容,所以我真的需要选择字符串“Suspected”

标签: r dplyr grepl


【解决方案1】:

我可能会这样做:

temp = sapply(your_data[columns_you_want_to_check],
              function(x) grepl("suspected", x, ingore.case = TRUE))
your_data$abnormal = rowSums(temp) > 0

我只使用了your_data,因为您的问题在dftest.file 之间切换。

如果你真的想使用mutate,你可以这样做

df %>%
mutate(abnormal = rowSums(
  sapply(select(., starts_with("var")),
         function(x) grepl("suspected", x, ingore.case = TRUE)
  )) > 0
)

如果您需要更高的效率,可以使用fixed = TRUE 而不是ignore.case = TRUE,前提是您可以指望案例一致。 (也许首先转换所有to_lower()。)

忽略&gt; 0 以获取每行的计数。

【讨论】:

  • 我使用了你的变异建议。这实际上产生了与我想要的不同的输出,但它最终工作得更好,因为该列具有字符串出现的次数。我的下一步是寻找有多个“可疑”调用的行。非常感谢
  • 听起来您错过了末尾的 &gt; 0 位(或者我可能遗漏了一个括号),但我很高兴这就是您想要的。
猜你喜欢
  • 2017-06-08
  • 1970-01-01
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
相关资源
最近更新 更多