这是上一个问题的一个更复杂的示例-使用Dplyr的“ group_by”创建组,然后使用Stringr查找组之间的差异。
我想继续使用dplyr
,stringr
如果可能的话,或者至少留在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] 删除。
我来说两句