2017-10-27 4 views
2

ここに私の謎があります。私は日々の研究で患者の状態を追跡しようとしています。私は私が私が昨日走った1 1対今日実行したレポートの違いを取得する方法を把握しようとしている数値でない2つの行列またはデータフレームの違いを取得するR

 P1 Waitlisted  
     P80 Lab Appointment 
     P19 Lab Appointment 
     P26 Waitlisted 

:私は現在、これを行うコードを構築していると、出力は次のようになります基本的に私のリストに掲載された新しい患者や削除された患者をすばやく追跡します。結果は

 P1 Waitlisted  
     P80 Lab Appointment 
     P80 Waitlisted 
     P19 Lab Appointment 
     P26 Waitlisted 
であれば2かあれば翌日の差として

 P20  Waitlisted 
     P5  Lab Appointment 

:次の日、私のデータフレームが

 P20  Waitlisted 
     P1  Waitlisted  
     P80  Lab Appointment 
     P19  Lab Appointment 
     P5  Lab Appointment 
     P26  Waitlisted 

であれば、私はの出力を得るでしょう

出力が生成されます。

 P80 Waitlisted 

私はまた、患者がその日の私のリストから削除された場合、私は

 P1 Waitlisted  
     P80 Lab Appointment 
     P26 Waitlisted 

のような出力を取得する場合ので、P19ラボの予定が私のリストにもはやであることを知っていない方法があるでしょう前に会話したいと思います今日。

私は以下のコードを試しましたが、真と偽を知る方法がないという論理的な要因しか得られません。

>apply(apply(df1,2,`==`,df2),1,any) 
    [1] FALSE TRUE FALSE FALSE FALSE NA NA NA TRUE TRUE FALSE 
    FALSE FALSE FALSE TRUE NA TRUE FALSE FALSE 
    [20] FALSE NA NA FALSE FALSE TRUE FALSE FALSE FALSE NA TRUE 
    FALSE FALSE TRUE NA NA TRUE TRUE TRUE 
    [39] TRUE TRUE NA NA NA TRUE 

答えて

2

アンチジョインを使用して、日数の差分を取得することができます。具体的にdata.tableであなたが行う可能性があります:

library(data.table) 
setDT(df1); setDT(df2) 
removed_patient_status <- df1[!df2, on = c("status", "patient")] 
new_patient_status <- df2[!df1, on = c("status", "patient")] 

removed_patient_status 
#Empty data.table (0 rows) of 2 cols: patient,status 

new_patient_status 
# patient   status 
#1:  P20  Waitlisted 
#2:  P5 Lab Appointment 

またはdplyr中を:

library(dplyr) 
removed_patient_status <- anti_join(df1, df2, by = c("status", "patient")) 
new_patient_status <- anti_join(df2, df1, by = c("status", "patient")) 

データ:あなたの最初の質問については

df1 <- data.frame(patient = c("P1", "P80", "P19", "P26"), status = c("Waitlisted", "Lab Appointment", "Lab Appointment", "Waitlisted"), stringsAsFactors = FALSE) 
df2 <- data.frame(patient = c("P20", "P1", "P80", "P19", "P5","P26"), status = c("Waitlisted", "Waitlisted", "Lab Appointment", "Lab Appointment", "Lab Appointment","Waitlisted"), stringsAsFactors = FALSE) 
0

df1 <- data.frame(P = c("P1","P80","P19","P26"), Status=c("Waitlisted","Lab Appointment", "Lab Appointment", "Waitlisted"))  

df2 <- data.frame(P = c("P20","P1","P80","P19","P5","P26"), Status=c("Waitlisted","Waitlisted","Lab Appointment","Lab Appointment","Lab Appointment", "Waitlisted"))     

df2[!(paste(df2$P, df2$Status) %in% paste(df1$P, df1$Status)),] #removed patients 
関連する問題