csv
id / pk/seqnごとに1行の束をマージしています。
> full = merge(demo, lab13am, by="seqn", all=TRUE)
> full = merge(full, cdq, by="seqn", all=TRUE)
> full = merge(full, mcq, by="seqn", all=TRUE)
> full = merge(full, cfq, by="seqn", all=TRUE)
> full = merge(full, diq, by="seqn", all=TRUE)
> print(length(full$ridageyr))
[1] 9965
> print(summary(full$ridageyr))
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 11.00 19.00 29.73 48.00 85.00
すべてが素晴らしいです。しかし、次のようにIDごとに複数の行を持つ別のファイルがあります。
"seqn","rxd030","rxd240b","nhcode","rxq250"
56,2,"","",NA,NA,""
57,1,"ACETAMINOPHEN","01200",2
57,1,"BUDESONIDE","08800",1
58,1,"99999","",NA
57
2つの行があります。したがって、このファイルを単純にマージしようとすると、行が1トン増え、データがすべて歪んでしまいます。
> full = merge(full, rxq, by="seqn", all=TRUE)
> print(length(full$ridageyr))
[1] 15643
> print(summary(full$ridageyr))
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 14.00 41.00 40.28 66.00 85.00
このようなデータを処理する通常の慣用的な方法はありますか?たとえばfull
、参加者が過去30日間にRXを取得したかどうかを示す列を作成したいとします。次のようなキーのリストを取得できます。
has_taken <- unique(rxq[rxq$rxd030 == "1",]$seqn)
hasnt_tak <- unique(rxq[rxq$rxd030 == "2",]$seqn)
full$takenRX <- ifelse(full$seqn %in% has_taken, TRUE, ifelse(full$seqn %in% hasnt_tak, FALSE, NA))
これで、データフレームtakenRX
の各行に対してTRUE / FALSE/NAが正しく表示されると思う列ができました。full
データのビットごとにこのようなことを手動で行う必要がありますか、それともキーごとに複数の行を持つこのデータをデータフレームに取り込むことができるより自動化された方法がありますか?もっとエレガントな提案はありますか?より慣用的なアプローチ?
他の列については、行を組み合わせて〜タプルができるようにしたいと思います。
key, a, b, c
2, 0, 0, 0
プラス
key, baz
2, foo
2, bar
私に次のようなものを与えます:
key, a, b, c, baz
2, 0, 0, 0, [foo, bar]
ただし、どのデータ構造を使用するかわからないため、[foo, bar]
後で論理として「hasfooinbaz」を簡単に使用できます。
家で一緒に遊ぶために、ここにいくつかのコードがありました/ありました