Как передать строку в фильтр dplyr в функции?

Я ищу способ передать строку в качестве входа в filter_ функция в пакете dplyr в моей собственной функции. Я настроил фрейм данных следующим образом:

df = data.frame(
    X1 = LETTERS[1:5], 
    X2 = c("apple", "apple", "apple", "banana", "banana")
)

Я ищу способ написать функцию, в которой я могу передать "яблоко" или "банан" для фильтрации фрейма данных.

Я пытался:

filterFruit = function(Data, Fruit){
   retVal = filter_(Data, "X2 == Fruit")
   return(retVal)
}

Затем передать значения:

apple1 = filterFruit(df, "apple")
apple1

Это вернет ошибку:

Error: object 'Fruit' not found

Я попробовал несколько других способов сделать это безуспешно, я надеюсь, что кто-то может помочь.

Редактировать:

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

df = data.frame(
    X1 = LETTERS[1:5], 
    X2 = c("apple", "apple", "apple", "banana", "banana")
    X3 = c("apple", "banana", "apple", banana", "apple")
)

и нужно решить, по какому столбцу (X2 или X3) вам нужно фильтровать.

2 ответа

Решение

Я использовал which чтобы получить фрукты. Чтобы получить только индекс, вы можете использовать retVal,

filterFruit <-  function(Data, column, Fruit){
  idx <- Data[,column]
  retVal <-  which(idx == Fruit)
  fruits_here <- Data[c(retVal), column]
  return(fruits_here)
}

Это должно ответить на ваши изменения:

library(dplyr)

df = data.frame(
  X1 = LETTERS[1:5], 
  X2 = c("apple", "apple", "apple", "banana", "banana"),
  X3 = c("apple", "banana", "apple", "banana", "apple"), 
  stringsAsFactors=FALSE
)

column_string = "X2"
column_value = "banana"
column_name <- rlang::sym(column_string)

filtered_df <- df %>%
  filter(UQ(column_name) == UQ(column_value))

filtered_df
Другие вопросы по тегам