私の問題は3つの質問を通して最もよく説明されるかもしれません。
1)。同じ条件を使用してインデックス(以下の例では列名を使用)を使用して複数の列を検索する方法はありますか?これを実装するためのよりエレガントな方法があるかどうか疑問に思っています(私は以下に別のアプローチがあります)?
sepsis <- subset(allhospitals, diag_p %in% c(78552, 99592) |
odiag1 %in% c(78552, 99592) |
odiag2 %in% c(78552, 99592) |
odiag3 %in% c(78552, 99592) |
## etc. etc.
2.)データをサブセット化した後、各列に両方の条件が存在する行の数をカウントしたいと思います(つまり、diag_p、odiag1、odiag2などで78552と99552が発生する回数)。
3.)最後に、上記の計算を行い、別の列の係数でスライスします。
私の戦略(ひどい)は次のとおりです。a。)列インデックスのベクトルを作成します。次にb。)2つの関数(条件ごとに1つ)を適用して、データをサブセット化し、行をカウントします。c。)列インデックスを唯一の列として使用して新しいデータフレーム(条件ごとに1つ)を作成します。そして最後にd。)列インデックス(つまり、新しいデータフレームの唯一の列)に書き込んだ関数で「apply」を使用します。
## indices for all columns of interest
ind <- c(35, seq(from=39, to=85, by=2))
## create one data frame and function per ICD-9 code (i.e., condition)
f7 <- function(x) nrow(subset(allhospitals, allhospitals[x]=="78552"))
t.7 <- data.frame("diag"=ind)
t.7$freq <- apply(t.7,1,f7)
f9 <- function(x) nrow(subset(allhospitals, allhospitals[x]=="99592"))
t.9 <- data.frame("diag"=ind)
t.9$freq <- apply(t.9,1,f9)
次に、これらすべてを処理して、データセット全体の集計値を取得します。問題は、いくつかの個別の要因に対してこれを行う必要があるため、上記のアプローチが非常に面倒になることです。plyrパッケージを使ったすべての試みは無益でしたが、私はRにかなり慣れていないので、おそらくここにも解決策があります。
アップデート:
plyrパッケージをもう一度試してみましたが、条件ごとに行数を取得する必要があるため、一度に1つの条件( "99592")と1つの列( "odiag1")を実行する必要がありますが、必要なものに近いものが得られました。 -すべての条件を組み合わせたわけではありません。ご覧のとおり、私のコードはまだ醜いようです。とにかく、データセットが非常に広くて操作が難しいため、「長い」形式に再形成する必要があるデータフレームが返されます。ここにいくつかの代表的なデータと私の更新されたddplyアプローチがあります:
サンプルデータ:
id patzip adm_yr diag_p odiag1 odiag2 odiag3 odiag4 etc. etc. etc.
Hosp A 93077 2010 99592 16932 22107 78552 NA
Hosp B 99804 2011 16932 99592 78552 12988 NA
Hosp B 94503 2010 22107 78552 12988 99592 16932
Hosp A 93013 2010 12988 22107 12988 NA NA
Hosp C 93112 2009 99592 78552 22107 NA NA
私の新しいアプローチ:
library(plyr)
df <- ddply(allhospital, .(id), summarize, diag_p = length(id[diag_p == 99592]),
odiag1 = length(id[odiag1 == 99592]), odiag2 = length(id[odiag2 == 99592]),
odiag3 = length(id[odiag3 == 99592]), odiag4 = length(id[odiag4 == 99592]),
odiag5 = length(id[odiag5 == 99592]), odiag6 = length(id[odiag6 == 99592]),
odiag7 = length(id[odiag7 == 99592]), odiag8 = length(id[odiag8 == 99592]),
odiag9 = length(id[odiag9 == 99592]), odiag10 = length(id[odiag10 == 99592]),
odiag11 = length(id[odiag11 == 99592]), odiag12 = length(id[odiag12 == 99592]),
odiag13 = length(id[odiag13 == 99592]), odiag14 = length(id[odiag14 == 99592]),
odiag15 = length(id[odiag15 == 99592]), odiag16 = length(id[odiag16 == 99592]),
odiag17 = length(id[odiag17 == 99592]), odiag18 = length(id[odiag18 == 99592]),
odiag19 = length(id[odiag19 == 99592]), odiag20 = length(id[odiag20 == 99592]),
odiag21 = length(id[odiag21 == 99592]), odiag22 = length(id[odiag22 == 99592]),
odiag23 = length(id[odiag23 == 99592]), odiag24 = length(id[odiag24 == 99592]))
更新2:
期待される結果がどのように見えるかを次に示します。
id diag Count.78552 Count.99552
Hosp A diag_p 4 0
Hosp A odiag1 10 8
Hosp A odiag2 17 16
Hosp A odiag3 9 10
Hosp B diag_p 5 8
Hosp B odiag1 1 3
Hosp B odiag2 0 1
Hosp B odiag3 0 0