0

csvid / 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

572つの行があります。したがって、このファイルを単純にマージしようとすると、行が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」を簡単に使用できます。

家で一緒に遊ぶために、ここにいくつかのコードがありました/ありました

4

1 に答える 1

3

更新された例に:

demog <- data.frame(key=c(2, 3), a=c(1,0), b=letters[1:2], c=LETTERS[1:2])
meds <- data.frame(key=c(2,2), baz=c('foo', 'baz'), stringsAsFactors=FALSE)
aggregate(baz~key, data=meds, FUN=list)
#  key      baz
#1   2 foo, baz

merge(demog, mermed)
#  key a b c      baz
#1   2 1 a A foo, baz

薬なしでケースを失いたくない場合は、all.x=TRUEを実際のケースに追加する必要があります。あなたの質問に対する私の批判の一部は、他のそのようなコーディングの欠陥を明らかにするのに十分な大きさのテストケースがないことでした.

> merge(demog, mermed, all.x=T)
  key a b c      baz
1   2 1 a A foo, baz
2   3 0 b B       NA

(以下はまだ当てはまると思います。) 関心のある医薬品の賢明な分類を構築し、個人レベルのレコードごとに、研究のために関心のあるカテゴリから 1 つを取っているかどうかを示す単一のレコードを作成する必要がある場合があります。これらの「rxd030」または「rxq250」コードは、脂質低下剤を圧縮する臨床グループであるかどうか疑問に思っていましたか? (そうではないことが判明しました。)これは、質問者が賢明なアドバイスを得るために、意味とコードを提供する必要があることを示しています。

少し検索すると、これはすでに行われている可能性があります。これは NHANES 1999-2000 の医薬品に関するウェブページから抜粋したものです。

Codebook

    SEQN - Respondent sequence number
    RXD030 - Taken prescription medicine/past month
    RXD240B - Standard generic ingredient name
    NHCODE - Standard generic ingredient code
    RXQ250 - Medicine container seen by interviewer
    RXD260 - Number of days taken medicine
    FDACODE1 - FDA/NDC drug class code 1 
    FDACODE2 - FDA/NDC drug class code 2
    FDACODE3 - FDA/NDC drug class code 3
    FDACODE4 - FDA/NDC drug class code 4
    FDACODE5 - FDA/NDC drug class code 5
    FDACODE6 - FDA/NDC drug class code 6

いくつかのカウントがある付録もあります。

Code or Value   Value Description   Count   Cumulative  Skip to Item
Generic drug code   Value was recorded  9138     9138   
        < blank >   Missing             6505    15643 

医療コードの 1 つ: 912 HYPERLIPIDEMIA

したがって、車輪を再発明する必要はないように見えますが、すでに行われている分類を使用できます。

まず、「RXD030: 過去 1 か月間に処方薬を服用または使用しましたか?」に基づいて変数を作成する必要があります。「いいえ」のケースは、すべてのカテゴリですべて 0 になります。

データを R にインポートし、「高脂血症薬」を調べました。「0912」カテゴリには FDACODE1 と FDACODE2 のみが使用されていることがわかります。以下は、一致する 2 つのコードの最初の 10 個の SEQN です。適切な質問を作成するのに役立つように、これを提供します。

> subset( medrecs,  FDACODE2 %in% "0912" )[1:10,"SEQN"]
 [1]   46   86   90  191  434 1029 1273 1634 1980 2105
> subset( medrecs,  FDACODE1 %in% "0912" )[1:10,"SEQN"]
 [1]  29  55  86 130 148 179 187 211 239 274

適切な質問は、これらの一部またはすべてからのすべての med レコードへのアクセスを提供するだけでなく、それらを持たず、一致する "demog" レコードを持ついくつかのサンプル med レコードへのアクセスを提供します。

于 2012-07-07T03:11:30.387 に答える