grep多个列上的一个模式

时间:2018-01-10 19:26:52

标签: r grep dplyr grepl

我正试图找出一种方法让我在grepl()的多个列上使用mutate()只有一个部分模式的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 。如果任何一列包含某个字符串,我想要一个新的列为TRUE或FALSE。

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

我试过

             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

以及其他约100件事。我希望最终格式为

select
p.*
from posts p, comments c
where c.post_id = p.post_id
group by p.post_id
order by avg(c.mark_first) desc

每当我尝试时,我每次都会得到假的

1 个答案:

答案 0 :(得分:2)

我可能会这样做:

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()。)

取消> 0以获取每行的计数。