Определите столбцы, которые содержат данную строку в R - PullRequest
1 голос
/ 07 мая 2020

Я пытаюсь создать функцию, которая для каждой строки определяет имя столбца, в котором встречается указанная строка.

Например, представьте, что в этом наборе данных я начинаю со строк 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() например здесь , но не могу понять, как заставить его перебирать строки. Помогите?

1 Ответ

4 голосов
/ 07 мая 2020

Вы можете сделать:

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
...