在多列上使用一种模式
grep one pattern over multiple columns
我正在尝试找出一种方法,让我在 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
每当我尝试时,我每次都会出错
我可能会这样做:
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
,因为你的问题在 df
和 test.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
以获得每行的计数。
我正在尝试找出一种方法,让我在 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
每当我尝试时,我每次都会出错
我可能会这样做:
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
,因为你的问题在 df
和 test.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
以获得每行的计数。