Существует ли функция R, которая может находить несколько значений для каждой группы?

#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"