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

Part 2 - Creating Groups with Dplyr's "group_by" then Using Stringr's "str_detect" to Find Differences Between Groups

这是上一个问题的更复杂的示例 -

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

在这个更复杂的示例中,我再次需要按 CaseWorker 和 Client 对数据进行分组并比较 "Task" 和 "Task2" 以找到 "Task2" 中所有不是的类别在 "Task"。还有一个 "Time" 列。

"Task" 可以有不在 "Task2" 中的类别,所以我只对查找 "Task2" 中不在 "Task" 中的类别感兴趣。如果能够创建一个新的列或数据框来显示 "Task2" 而不是 "Task" 中的特定条目以及关联的 "Time" 值,那就太好了。

客户 "Chris" 的最终结果应该显示 "Iron shirt" 和 "Do homework",因为这两个类别都不在 "Task" 中,并且应该显示总数 "Time" 每一个。

对于客户端 "Eric",它应该显示 "Iron shirt" 和 12 的 "Time"。

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)

我们使用 setdiffpastetoString 一起获取 'Task2' 中不在 'Task' 中的元素(包装 paste(..., collapse=', ')) 按 'CaseWorker' 和 'Client'

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

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

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 放在一起,即 summarise 步骤中的 New= toString(unique(tolower(Task2)))