Вместо case_when
, который я представляю из пакета dplyr
, почему бы вам не попробовать вместо него функцию filter
, которая лучше подходит для поднабора наборов данных.
library(dplyr)
library(magrittr)
dfRawData <- data.frame(
"Model" = c(
"Car1",
"Car1",
"Car1",
"Car2",
"Car2",
"Car2",
"Car3",
"Car3",
"Car3"
),
"variable" = c(
"Metric1",
"Metric2",
"Metric3",
"Metric1",
"Metric2",
"Metric3",
"Metric1",
"Metric2",
"Metric3"
),
"valeur" = c(1, 2, 3, 4, 5, 6, 7, 8, 9)
)
# Filter
newData <- dfRawData %>%
filter((Model =='Car1' & variable %in% c('Metric1', 'Metric2')) | # Condition 1
(Model %in% c('Car2', 'Car3') & variable == 'Metric1')) # Condition 2
Это приводит к выводу, подобному следующему:
newData
Model variable valeur
1 Car1 Metric1 1
2 Car1 Metric2 2
3 Car2 Metric1 4
4 Car3 Metric1 7
Вы можете отрегулировать условия filter
, чтобы получить именно то подмножество, которое вам нравится, и это должен быть более простой синтаксис, чем case_when
.
Использование функции
Чтобы упростить эту задачу и указать carName
, вы можете заключить этот конкретный фильтр в простой (хотя и хрупкий)) функция:
myFilterFunction <- function(data, carName = 'Car1', metric = c('Metric1', 'Metric2')) {
data %>%
filter(Model %in% carName & variable %in% metric)
}
carName = 'Car1'
myFilterFunction(dfRawData, carName = carName, c('Metric1', 'Metric2'))
carName = c('Car2', 'Car3')
myFilterFunction(dfRawData, carName = carName, c('Metric1'))
с выходами:
Model variable valeur
1 Car1 Metric1 1
2 Car1 Metric2 2
Model variable valeur
1 Car2 Metric1 4
2 Car3 Metric1 7