17

私は、11 年以上にわたる臨床診療の請求記録の大規模なデータセットを扱っています。かなりの数の行で、紹介医が欠落しています。ただし、いくつかのルールを使用すると、非常に簡単に入力できますが、R の下で data.table に実装する方法がわかりません。zoona.locfパッケージや、data.table パッケージの自己ローリング結合などがあることは知っています。私が見た例は単純すぎて役に立ちません。

これは、あなたを導くための架空のデータです(dput ASCIIテキスト表現として)

    structure(list(patient.first.name = structure(c(1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), .Label = c("John", "Kathy", 
"Timothy"), class = "factor"), patient.last.name = structure(c(3L, 
3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L), .Label = c("Jones", 
"Martinez", "Squeal"), class = "factor"), medical.record.nr = c(4563455, 
4563455, 4563455, 4563455, 4563455, 2663775, 2663775, 2663775, 
2663775, 2663775, 3330956, 3330956, 3330956, 3330956), date.of.service = c(39087, 
39112, 39112, 39130, 39228, 39234, 39244, 39244, 39262, 39360, 
39184, 39194, 39198, 39216), procedure.code = c(44750, 38995, 
40125, 44720, 44729, 44750, 38995, 40125, 44720, 44729, 44750, 
44729, 44729, 44729), diagnosis.code.1 = c(456.87, 456.87, 456.87, 
456.87, 456.87, 521.37, 521.37, 521.37, 521.37, 356.36, 456.87, 
456.87, 456.87, 456.87), diagnosis.code.2 = c(413, 413, 413, 
413, 413, 532.23, NA, NA, NA, NA, NA, NA, NA, NA), referring.doctor.first = structure(c(1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, NA, NA, NA, 1L, 1L, NA), .Label = c("Abe", 
"Mark"), class = "factor"), referring.doctor.last = structure(c(1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, NA, NA, NA, 1L, 1L, NA), .Label = c("Newstead", 
"Wydell"), class = "factor"), referring.docotor.zip = c(15209, 
15209, 15209, 15209, 15209, 15222, 15222, 15222, NA, NA, NA, 
15209, 15209, NA), some.other.stuff = structure(c(1L, 1L, 1L, 
NA, 3L, NA, NA, 4L, NA, 6L, NA, 2L, 5L, NA), .Label = c("alkjkdkdio", 
"cheerios", "ddddd", "dddddd", "dogs", "lkjljkkkkk"), class = "factor")), .Names = c("patient.first.name", 
"patient.last.name", "medical.record.nr", "date.of.service", 
"procedure.code", "diagnosis.code.1", "diagnosis.code.2", "referring.doctor.first", 
"referring.doctor.last", "referring.docotor.zip", "some.other.stuff"
), row.names = c(NA, 14L), class = "data.frame")

明らかな解決策は、refering.doctor.last および refering.doctor.first に対して何らかの種類の最終観測値の繰り越し (LOCF) アルゴリズムを使用することです。ただし、新しい患者に到達すると停止する必要があります。つまり、LOCF は、患者名、患者名、医療記録番号の組み合わせによって識別される 1 人の患者にのみ適用する必要があります。また、何人かの患者が最初の来院時に紹介医を見逃していることに注意してください。問題を複雑にしているのは、一部の患者がかかりつけの医師を変更することで、ある医師が先に紹介し、別の医師が後で紹介する場合があることです。したがって、アルゴリズムは、値が欠落している行の日付順を認識する必要があります。

動物園na.locfでは、患者ごとに LOCF をグループ化する簡単な方法はありません。私が見たローリング結合の例は、date.of.service や procedure.code などを失うため、参照.doctor 情報が欠落している行を単純に取り出すことができないため、ここでは機能しません。R が不足しているデータをどのように埋めることができるかを学ぶために、あなたの助けをいただければ幸いです。

4

2 に答える 2

26

もっと簡潔な例は答えるのが簡単だったでしょう。たとえば、冗長に見える列をかなり多く含めました。本当に名と姓である必要がありますか、それとも患者番号を使用できますか?

すでにNAデータにsがあり、入力したいのでroll、実際にはありませdata.tableん。ローリング結合は、データにデータがないが、データ間の位置に結合NAする別の時系列(たとえば)がある場合に適しています。(効率上の利点の1つは、最初に作成せず、次に2番目のステップに入力する必要があるという事実です。)つまり、質問では、データセットが1つだけです。あなたは2つに参加していません。NA

na.locfしたがって、@Joshuaが提案したように必要です。ただし、順方向に入力してから最初の値を逆NA方向に入力する関数を認識していません。

で、グループでdata.table使用するには、次のようになります。na.locf

require(data.table)
require(zoo)
DT[,doctor:=na.locf(doctor),by=patient]

これには、参照による高速集約と更新の効率上の利点があります。最初の非逆方向na.locfにロールするには、上に新しい小さな関数を作成する必要があります。NA

データが最初に患者、次に日付でソートされていることを確認してください。by次に、各グループ内の行の順序を維持するため、上記は時間の経過に伴う医師の変化に対処します。

それがあなたにいくつかのヒントを与えることを願っています。

于 2012-09-26T22:19:15.243 に答える
22

@MatthewDowle は素晴らしい出発点を提供してくれました。ここで結論を出します。

簡単に言えば、 zooのを使用しますna.locf。この問題は、ローリング結合には適していません。

setDT(bill)
bill[,referring.doctor.last:=na.locf(referring.doctor.last,na.rm=FALSE),
     by=list(patient.last.name, patient.first.name, medical.record.nr)]
bill[,referring.doctor.last:=na.locf(referring.doctor.last,na.rm=FALSE,fromLast=TRUE),
     by=list(patient.last.name, patient.first.name, medical.record.nr)]

次に、同様のことを行いますreferring.doctor.first

いくつかの指針:

  1. このbyステートメントは、持ち越された最後の観察が同じ患者に制限されることを保証し、持ち越しがリストの次の患者に「出血」しないようにします。

  2. na.rm=FALSE引数を使用する必要があります。そうしないと、最初の訪問時に紹介医の情報が欠落している患者はNA削除され、新しい値のベクトル (既存 + 繰り越し) は行数の 1 要素不足になります。短縮されたベクトルは再利用され、すべてが上にシフトされ、最終行は再利用されたときにベクトルの最初の要素を取得します。つまり、大混乱。そして最悪なのは、たまにしか見られないことです。

  3. fromLast=TRUE再度カラムを通過するために使用します。これにより、データの前にある NA が埋められます。最後の観測の繰り越し (LOCF) の代わりに、zoo は次の観測の繰り越し (NOCB) を使用します。幸福 - ほとんどの状況に適した方法で不足しているデータを入力しました。

  4. :=たとえば、1行に複数渡すことができますDT[,`:=`(new=1L,new2=2L,...)]

于 2012-09-27T23:34:22.417 に答える