#r #dataframe #filter #group-by #grouping
#r #фрейм данных #Фильтр #группировка по #группировка
Вопрос:
В моем наборе данных есть 3 группы: кофе, чай и вода. Набор данных выглядит следующим образом
df <- data.frame(drink = c('Coffee','Coffee', 'Coffee', 'Coffee', 'Coffee', 'Tea', 'Tea', 'Tea', 'Tea', 'Tea', 'Water', 'Water', 'Water','Water', 'Water'), date = as.Date(c('2020-08-01', '2020-08-02', '2020-08-03', '2020-08-04', '2020-08-05', '2020-08-02', '2020-08-03', '2020-08-04', '2020-08-05', '2020-08-06', '2020-08-03', '2020-08-04', '2020-08-05', '2020-08-06', '2020-08-07')))
Теперь у меня есть три типа напитков и даты, когда я пил каждый напиток. В некоторые дни я пил все три, в некоторые дни два из трех, а в некоторые дни только один из трех.
drink date
Coffee 2020-08-01
Coffee 2020-08-02
Coffee 2020-08-03
Coffee 2020-08-04
Coffee 2020-08-05
Tea 2020-08-02
Tea 2020-08-03
Tea 2020-08-04
Tea 2020-08-05
Tea 2020-08-06
Water 2020-08-03
Water 2020-08-04
Water 2020-08-05
Water 2020-08-06
Water 2020-08-07
Допустим, я хочу знать, была ли какая-то конкретная группа, где я пил 08-04-2020, 08-05-2020 и 08-06-2020. Я хочу иметь функцию, которая возвращала бы мне чай и воду, поскольку я выпил оба из них в указанные дни.
Я пытался использовать что-то подобное, но это не работает
with(df, drink[date == 2020-08-04 amp;amp; date == 2020-08-05 amp;amp; date == 2020-08-06])
Существует ли какая-либо другая функция, которая может просматривать одну и ту же группу с разными значениями в каждой строке этой группы и фильтровать для проверки требуемых значений? Может быть, есть способ использовать groupby. Любые предложения будут полезны
Комментарии:
1. Исправлено! Извините за это
Ответ №1:
Вы можете попробовать эту функцию :
get_common_drink <- function(data, dates) {
df1 <- subset(data, date %in% dates)
Reduce(intersect, split(df1$drink, df1$date))
}
get_common_drink(df, as.Date(c('2020-08-04', '2020-08-05', '2020-08-06')))
#[1] "Tea" "Water"
Ответ №2:
Вы можете использовать unstack
on df
и подмножество для определенных дат, а затем использовать intersect
within Reduce
для поиска значений во всех подмножествах.
Reduce(intersect, unstack(df)[c("2020-08-04", "2020-08-05", "2020-08-06")])
#[1] "Tea" "Water"
или подмножество перед unstack
Reduce(intersect, unstack(df[df$date %in% as.Date(c("2020-08-04",
"2020-08-05", "2020-08-06")),]))
#[1] "Tea" "Water"