第 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
这是上一个问题的更复杂的示例 - 。
如果可能,我想继续使用 dplyr
和 stringr
,或者至少留在 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)
我们使用 setdiff
、paste
与 toString
一起获取 '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)))
。
这是上一个问题的更复杂的示例 -
如果可能,我想继续使用 dplyr
和 stringr
,或者至少留在 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)
我们使用 setdiff
、paste
与 toString
一起获取 '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)))
。