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

问题描述 投票:0回答:1

我试图创建一个函数,为每一行识别指定字符串出现的列名。

例如,在这个数据集中,想象我从第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) (见 此处),但这似乎并不奏效,而且随着迭代的 stringr::str_detect() (如 此处). 我也试过 dplyr:contains() 喜欢 此处 但不知道如何让它在行上迭代。求助于我?

r string detect
1个回答
4
投票

你可以这样做。

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
© www.soinside.com 2019 - 2024. All rights reserved.