我有一个字符变量数据集:
col1 = c("a","b","c")
col2 = c("a","b_a","d")
df = data.frame(col1,col2)
col1 col2
1 a a
2 b b_a
3 c d
我想创建一个变量 a,如果该行中的任何值包含子字符串“a”,则该变量 a 会标记为 1,0。
col1 col2 a
1 a a 1
2 b b_a 1
3 c d 0
我的尝试如下。它并没有完全做到这一点,因为我相信如果数据帧中的任何值包含子字符串而不是行,则它需要 TRUE
。
df["a"] = ifelse(any(sapply(df,function(x) str_detect(x,"a")),TRUE),1,0)
我的想法是,使用 ifelse
语句时,ifelse
语句中的任何函数仅计算 df[i,]
而不是整个dataframe,其中 i
是它正在查看的行。事实似乎并非如此。
如何构建我正在寻找的数据框?请注意,在我的真实数据集中,有 100 多列,因此将它们全部列出来是没有意义的。
为什么 ifelse 不只计算
df
的第i
行,而不是整个df
?
请注意,之前的问题仅查看 at one variable ,我正在查看所有变量,因此这不是重复的。
最佳答案
您可以使用
grepl('a', paste0(df$col1, df$col2))
或者概括为任意数量的列
grepl('a', do.call(paste0, df))
还有第三个选项,如果您要搜索多字符子字符串而不是单个字母,这可能更安全。在这种情况下,您可能希望避免使用 paste
,以便例如在向量 c('xa', 'bx')
中搜索 'ab'
不会给出误报。在这种情况下,我们可以使用:
substr = 'a'
as.logical(colSums(apply (df, 1, function(x) grepl(substr, x))))
关于r - 如果任何行包含子字符串,则标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53583758/