识别包含 R 中给定字符串的列

Identify the columns that contain a given string in R

我正在尝试创建一个函数,该函数为每一行标识出现指定字符串的列的名称。

例如,假设我在这个数据集中从第 1-3 行开始。我想创建一个新列 desired_column,其中包含出现 "foo" 的行。

row1 <- c('a', 'b', 'c', 'foo')
row2 <- c('foo', 'a', 'foo', 'b')
row3<- c('b', 'foo', 'b', 'b')
desired_column <- c('row2', 'row3', 'row2', 'row1')
df <- data.frame(row1, row2, row3, desired_column)

     row1 row2   row3        desired_column
1    a    foo    b           row2
2    b    a      foo         row3
3    c    foo    b           row2
4    foo  b      b           row1

我试过使用像 which(df == "foo", arr.ind = TRUE) 这样的函数(参见 ), but that doesn't seem to work, and with iterations of stringr::str_detect() (e.g., ). I've also tried dplyr:contains() like 但不知道如何让它遍历行。帮助?

你可以这样做:

df$desired_column <- names(df)[max.col(cbind(df, FALSE) == "foo", ties.method = "last")]

给出:

  row1 row2 row3 desired_column
1    a  foo    b           row2
2    b    a  foo           row3
3    c  foo    b           row2
4  foo    b    b           row1

使用 cbind(df, FALSE) 确保在任何特定行中没有匹配项时返回 NA

针对您的评论,grepl() 可用于部分匹配或 agrepl() 用于模糊匹配:

row1 <- c('a', 'b', 'c', 'fool')
row2 <- c('foo', 'a', 'foo', 'b')
row3<- c('b', 'foo', 'b', 'b')
df <- data.frame(row1, row2, row3)
df$desired <- max.col(cbind(sapply(df, grepl, pattern = "foo"), FALSE), ties.method = "last")

给出:

  row1 row2 row3 desired
1    a  foo    b    row2
2    b    a  foo    row3
3    c  foo    b    row2
4 fool    b    b    row1