Как передать строку в фильтр 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