Создание групп с помощью Dplyr group_by, а затем использование Stringr или операций с наборами для поиска различий между группами

Я хотел бы использовать dplyr и stringr, если это возможно, или, по крайней мере, оставаться в пределах Tidyverse, чтобы добиться следующего:

Мне нужно сгруппировать данные по CaseWorker и клиенту и сравнить «Задача» и «Задача2», чтобы найти все категории в «Задаче2», которых нет в «Задаче», вместе с соответствующим общим временем для категории «Задача2».

«Задача» может иметь категории, которых нет в «Задаче 2», поэтому меня интересует только поиск категорий в «Задаче 2», которых нет в «Задаче». Было бы здорово иметь возможность создавать новые столбцы для отображения конкретных записей, которые находятся в «Задаче 2», а не в «Задаче», вместе со связанным значением «Время».

Конечный результат должен показать четыре новых столбца для клиента Криса, один для «Железной рубашки» и один столбец для связанного «Время» 45, а также столбец «Сделать домашнее задание» и столбец «Время», равный 21. Будет быть двумя новыми столбцами для клиента Эрика, один для «Железной рубашки» и один для связанного времени 12.

 CaseWorker<-c("John","John","John","John","John","John","John","John",
"John","Kim","Kim")

  Client<-c("Chris","Chris","Chris","Chris","Chris","Chris","Chris","Chris","Chris","Eric","Eric")

Task<-c("Feed cat","Feed cat","Feed cat","Make dinner","Make dinner","Make dinner","Buy groceries","Buy groceries","Buy groceries","Do homework","Do homework")

Task2<-c("Feed cat","Iron shirt","Iron shirt","Do homework","Do homework","Do homework","Make dinner","Feed cat","Feed cat","Do homework","Iron shirt")

Time<-c(20,34,11,10,5,6,55,30,20,10,12)

Df<-data.frame(CaseWorker,Client,Task,Task2,Time)

person Mike    schedule 17.11.2016    source источник
comment
Неясно, как должны выглядеть ожидаемые выходные столбцы. У меня широкий формат в решении, размещенном ниже   -  person akrun    schedule 17.11.2016


Ответы (1)


Мы можем попробовать

library(dplyr)
library(tidyr)
Df %>% 
   group_by(CaseWorker, Client) %>%
   filter(Task2 %in% setdiff(Task2, Task)) %>% 
   group_by(Task2, add=TRUE) %>% 
   summarise(Time = sum(Time)) %>% 
   spread(Task2, Time)
#   CaseWorker Client `Do homework` `Iron shirt`
#*     <fctr> <fctr>         <dbl>        <dbl>
#1       John  Chris            21           45
#2        Kim   Eric            NA           12
person akrun    schedule 17.11.2016