第2部分-使用Dplyr的“ group_by”创建组,然后使用Stringr的“ str_detect”查找组之间的差异

麦克风

这是上一个问题的一个更复杂的示例-使用Dplyr的“ group_by”创建组,然后使用Stringr查找组之间的差异

我想继续使用dplyrstringr如果可能的话,或者至少留在Tidyverse之内。

在这个更复杂的示例中,我再次需要按CaseWorker和客户端对数据进行分组,并比较“任务”和“任务2”,以找到“任务2”中不在“任务”中的所有类别。还有一个“时间”列。

“任务”可以具有不在“任务2”中的类别,因此我只想在“任务2”中查找不在“任务”中的类别。能够创建一个新列或数据框以显示“ Task2”中而不是“ Task”中的特定条目以及相关的“ Time”值将是很棒的。

最终结果应为客户“ Chris”显示“ Iron shirt”和“ Do homework”,因为这两个类别均不在“任务”中,并且应显示每个项的总“时间”。

对于客户“ Eric”,应显示“ Iron shirt”和“ Time”为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)
阿克伦

使用'CaseWorker'和'Client'分组后setdiff我们使用'Task2'中的'Task2'中没有的元素,将paste它们与toString(包装器paste(..., collapse=', ')一起使用

library(dplyr)
Df %>% 
   group_by(CaseWorker, Client) %>% 
   summarise(New = toString(setdiff(Task2, Task)))

如果我们需要sum'Task2'的子元素的'Time'列,则filter在该summarise步骤之前的'Task2'

Df %>%
   group_by(CaseWorker, Client) %>%
   filter(Task2 %in% setdiff(Task2, Task)) %>% 
   summarise(New= toString(unique(Task2)), Time = sum(Time))
#    CaseWorker Client                                  New  Time
#        <fctr> <fctr>                                <chr> <dbl>
#1         John  Chris Iron shirt, Do Homework, Do homework    66
#2          Kim   Eric                           Iron shirt    12

“ Task2”中的某些元素具有大小写差异。如果需要整理,则转换为较低或较高的值,将unique元素和元素paste放在一起,即New= toString(unique(tolower(Task2)))summarise步骤中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档