2016-10-11 10 views
2

データフレームの文字列で行を比較し、それを第2のデータフレームと比較する必要があります。試験データフレームは、以下に示されている。Rデータフレーム内の文字列を列で比較して新しい列を作成する

pat_id line_code month_rule 
1  r  0 
1  chop  0 
1  rchop 0 
1  rchop 0 
1  rchp  0 
1  rchp  0 
1  rchop 1 
1  fr  0 
2  f  0 
2  fr  0 
2  fr  1 

ベンチデータフレーム(ベンチマーク)は、比較のための標準ラインコードを有する。以下のサンプルのベンチマークデータフレームである -

line_code 
gb 
rc 
br 
fr 
ir 
r2 
rchop 
rcyclo 
rcvp 
rfnd 
rcp 
cp 

フォーカスが新しい行である場合を識別するテストデータフレーム内の新しい列を作成することです。以下の新しい行を識別するための条件である -

  1. month_ruleが1である場合、それは行6までのすべてが単一の行に属し、患者1のための新たなライン
  2. あります。これは、文字列 "r"、 "chop"、 "rchp"がベンチマークデータフレームの一部ではないためです。
  3. 行7では、患者1は、ベンチマークデータフレームと一致する「fr」ラインコードを有し、したがってそれは新しいラインでもある。

最終出力データは次のようになります -

pat_id line_code month_rule line 
1  r  0   1 
1  chop  0   1 
1  rchop 0   1 
1  rchop 0   1 
1  rchp  0   1 
1  rchp  0   1 
1  rchop 1   2 
1  fr  0   3 
2  f  0   1 
2  fr  0   1 
2  fr  1   2 

私のアプローチは、この使用してdplyrを解決することでした。非常に多くの条件があったので、私は最終的な解決に到達できませんでした。ここで私はそれについて考えていた -

library(dplyr) 
test<-test%>%rowwise()%>% 
     mutate(test$line=ifelse(month_rule==0 & test$line_code!=bench$line_code), 1,0) 

これは最終的な解決策ではありません。しかし、それを解決する良い方法はありますか?

+1

ベンチマークデータフレームに 'rchop'があります。どうして3行目で' pat_id == 1 'に改行しませんか?また、frもベンチマークデータフレームにあり、10行目に 'pat_id == 2 'の新しい行はありませんか? – Psidom

+2

'r'タグを使用しているときは、' dput() 'でデータを共有してください。マウスの上にマウスを置くと詳細情報が表示されます。 –

+0

@Psidom基本的に、ラインコードは、時間枠の間に患者に提供される異なる薬剤です。行1の患者== 1の場合、彼は「r」投薬のみが与えられる。行2では、「c」、「h」、「o」、「p」投薬が与えられる。 3行目には全ての "rchop"投薬が与えられていますが、まだ1行目に入っています.6行目では "rchp"しか与えられませんが、それはその患者の1行目に属しています。 – x1carbon

答えて

0

これは動作するはずです:line_codeはベンチマークデータフレームの一部であり、場合にのみ場合

test <- test %>% 
    group_by(pat_id) %>% 
    mutate(var1 = (line_code %in% bench$line_code)) %>% 
    mutate(var2 = ifelse(row_number() > 1, 
         mapply(grepl, lag(line_code), line_code), 
         0)) %>% 
    mutate(line = 1 + cumsum(month_rule | (var1 & !var2))) %>% 
    select(-var1, -var2) 

var1はtrueです。

var2は、前のline_codeの「組み合わせ」(line_code)の場合にのみtrueです。

したがってmonth_rule | (var1 & !var2)は、月ルールが満たされているか(ベンチマークデータと新薬からのものである場合のみ)、真となります。したがって、lineはあなたの期待した結果です。

関連する問題