2016-11-14 14 views
0

以下の例を使用して、CaseWorker、次にClientによってデータフレームをグループ化し、各クライアントグループに対して、 「Task2」のタスクのリストと同じです。Dplyrの "group_by"でグループを作成し、Stringrを使用してグループ間の相違を見つける

"Task2"ではなく "Task"にある各タスクを抽出して新しい列またはデータフレームに表示できる場合は、単純な真偽または偽に満足します。

基本的に、「タスク」と「タスク2」にはそれぞれのクライアントごとに同じエントリが含まれていることを確認する必要があります。

可能であればDplyrとStringrを使いたい、あるいは少なくともTidyverseに滞在したいと思います。私は、 "group_by"と "str_detect"やその他のStringr機能を使い、エレガントな方法でこれを実現する方法があると思っています。

CaseWorker<-c("John","John","John","John","John","John","Melanie","Melanie","Melanie","Melanie","Melanie","Melanie") 
Client<-c("Chris","Chris","Chris","Tom","Tom","Tom","Valerie","Valerie","Valerie","Tim","Tim","Tim") 
Task<-c("Feed cat","Make dinner","Iron shirt","Make dinner","Do homework","Make lunch","Make dinner","Feed cat","Buy groceries","Do homework","Iron shirt","Make lunch") 
Task2<-c("Feed cat","Make dinner","Iron shirt","Make dinner","Do homework","Feed cat","Make dinner","Feed cat","Iron shirt","Do homework","Iron shirt","Make lunch") 
Df<-data.frame(CaseWorker,Client,Task,Task2) 

答えて

2

これがあなたの後であるかどうかを確認してください。

最初に、TaskTask2と一致するかどうかを確認します。そうでない場合は、Task2を新しい変数として返します。私は、すべてのエントリのためであれば、個々のCaseWorker/Clientペアの試合を見るために、新たなデータフレームdf2

df2 <- Df %>% 
    mutate(match = Task == Task2, 
      non_match = ifelse(!match, Task2, "")) 
df2 

# CaseWorker Client   Task  Task2 match non_match 
# 1  John Chris  Feed cat Feed cat TRUE   
# 2  John Chris Make dinner Make dinner TRUE   
# 3  John Chris Iron shirt Iron shirt TRUE   
# 4  John  Tom Make dinner Make dinner TRUE   
# 5  John  Tom Do homework Do homework TRUE   
# 6  John  Tom Make lunch Feed cat FALSE Feed cat 
# 7  Melanie Valerie Make dinner Make dinner TRUE   
# 8  Melanie Valerie  Feed cat Feed cat TRUE   
# 9  Melanie Valerie Buy groceries Iron shirt FALSE Iron shirt 
# 10 Melanie  Tim Do homework Do homework TRUE   
# 11 Melanie  Tim Iron shirt Iron shirt TRUE   
# 12 Melanie  Tim Make lunch Make lunch TRUE   
その後 summarise

結果にこれを保存します。あなたは、元のデータセットのall_match変数を必要に応じて

df2 %>% 
    group_by(CaseWorker, Client) %>% 
    summarise(n = n(), 
      matches = sum(match), 
      all_match = n == matches) 

# CaseWorker Client  n matches all_match 
#  <chr> <chr> <int> <int>  <lgl> 
# 1  John Chris  3  3  TRUE 
# 2  John  Tom  3  2  FALSE 
# 3 Melanie  Tim  3  3  TRUE 
# 4 Melanie Valerie  3  2  FALSE 

それからもちろん、あなたのデータフレームに戻し、これをマージすることができます。

+0

ありがとうございます!私はこの質問の「パート2」をより複雑ではあるが同様の質問で掲示しました。同じ質問名​​で掲載されていますが、最初は「パート2」です。 – Mike

1

あなたは、あなたが以下のことができることを心配している場合、これは、正確なケースマッチングにかかっ単にdplyr%in%

Df %>% 
    group_by(CaseWorker,Client) %>% 
    mutate(Check = Task %in% Task2) 

を使用してこれを行うことができます。

Df %>% 
    group_by(CaseWorker,Client) %>% 
    rowwise() %>% 
    mutate(Check = grepl(Task, Task2, ignore.case = TRUE)) 

しかし、grepl(またはほとんどのR関数)のベクトル化された性質を回避するためには、mutateの前にrowwiseを使用する必要があります

0

stringrパッケージを使用する場合は、以下もあなたのために働くことができます。

Df %>% 
    group_by(CaseWorker,Client) %>% 
    mutate(Check=str_detect(as.character(Task),as.character(Task2)) 
0

これはちょうど私は質問を誤解されるかもしれないが、私はあなたが何をしたいことは、単にタスクTask2のと一致しないレコードがある場合には上に複雑このかもしれないと思います。

> Df[which(Df$Task != Df$Task2),] 

=== ========== ======= ============= ========== 
\ CaseWorker Client Task   Task2  
=== ========== ======= ============= ========== 
6 John  Tom  Make lunch  Feed cat 
9 Melanie  Valerie Buy groceries Iron shirt 
=== ========== ======= ============= ========== 
関連する問題