grep для нескольких переменных r - PullRequest
0 голосов
/ 22 мая 2019

Я застрял, пытаясь сделать что-то, что должно быть простым: Используйте grep(), чтобы проверить соответствие шаблона в строке для нескольких переменных в одном кадре данных. Все поиски этого приводят меня к инструкциям о том, как grep() на нескольких образцах.

Создать данные:

df <- data.frame(a = c("apple", "plum", "pair", "apple"), 
                 b = c(1, 2, 3, 4), 
                 c = c("plum", "apple", "grape", "orange"))
df
      a b      c
1 apple 1   plum
2  plum 2  apple
3  pair 3  grape
4 apple 4 orange

Теперь я хочу проверить df$a и df$c для строки "apple". Я хочу сделать это, потому что я хочу значения от df$b для всех строк с «яблоком» в df$a или df$c.

Я надеялся создать функцию: f(x)::grep("apple", df$x) и использовать lapply для проверки ее по списку имен переменных, которые я хочу проверить для шаблона:

check_apple <- function(x) {
   grep("apple", df$x)
}

Но это не работает:

check_apple(a)
integer(0)

Однако это работает:

grep("apple", df$a)
[1] 1 4

Почему эта функция не работает? Могу ли я не использовать имя переменной в качестве аргумента в моей функции?

Мой план состоял в том, чтобы применить функцию ко всем переменным, и они свернули результирующий список в один вектор, прежде чем выбирать значения unique(), чтобы получить все строки в кадре данных, в которых есть переменные с совпадением строк. Само собой разумеется, что мой набор данных намного больше, чем этот пример.

Могу ли я исправить функцию или есть другой способ запустить grep() для нескольких переменных?

1 Ответ

0 голосов
/ 22 мая 2019

Ваша функция не работает, потому что вы пытаетесь передать объект a в функцию, но этот объект не существует в вашей среде. Функция тихо выходит из строя и не дает понять, что это происходит, что может быть одной из самых сложных вещей в R.

Один из способов заставить вашу функцию работать, это передать имя столбца как символ функции и найти правильный столбец в фрейме данных:

check_apple <- function(x) {
 grep("apple", df[, x])
}


check_apple('a')
[1] 1 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...