1

私は次のようにDBと呼ばれるマトリックスに集中しているデータベースを持っています:

         PN        time.state.2 STATUS
   [1,] 6954010001            0    3.0
   [2,] 6954010001            3    3.5
   [3,] 6954010001            6    3.5
   [4,] 6954010001            9    3.5
   [5,] 6954010001           12    3.5

多くの被験者があり、それぞれに複数の行が登録されています(ステータスが登録されている患者の異なる訪問です)。

同じ患者がその後の訪問で自分の STATUS の値を増やした場合、「進行」と呼ばれるオブジェクトを作成する for ループを作成したいと思います。

インデックス「i」に患者の PN コードを割り当てて、患者の治療を終えたときにさらに先に進むことができるようにする方法がわかりません。

たとえば、time.state.2 オブジェクトによって強調表示された各時点でこれらの SCORE 値を持つ 1 人の患者の場合、その患者の最初の時点 (最初の来院) と比較して SCORE 値が 1 ポイント増加すると、その患者は進行中と見なされます。病院で)。さらに、この PROGRESSION は、次の訪問で確認する必要があります (この患者では、時間 6 で STATUS が 4.0 (最初の訪問の 3.0 よりも 1 ポイント高い) に達し、この値は次の訪問で確認されるため、PROGRESSION が確認されます。)

         PN        time.state.2 STATUS  PROGRESSION
   [1,] 6954010001            0    3.0            0
   [2,] 6954010001            3    3.5            0
   [3,] 6954010001            6    4.0            1
   [4,] 6954010001            9    4.0            0
   [5,] 6954010001           12    4.5            0
   [6,] 6954010001           15    4.5            0

また、各患者の PROGRESSION は初回のみ 1 であり、進行後に (その患者の) 後続の訪問を削除することもできます。例えば:

         PN        time.state.2 STATUS  PROGRESSION
   [1,] 6954010001            0    3.0            0
   [2,] 6954010001            3    3.5            0
   [3,] 6954010001            6    4.0            1
   [4,] 6954010002            0    6.0            0
   [5,] 6954010002            3    6.0            0

PROGRESSION=1 で最初の患者が停止したとき。

4

1 に答える 1

1

私はあなたがこのようなものが欲しいと信じています:

#create data
DF <- read.table(text="         PN        time.state.2 STATUS
   [1,] 6954010001            0    3.0
   [2,] 6954010001            3    3.5
   [3,] 6954010001            6    3.5
   [4,] 6954010001            9    3.5
   [5,] 6954010001           12    3.5
   [6,] 6954010002            0    3.0
   [7,] 6954010002            3    3.0
   [8,] 6954010002            6    3.5
   [9,] 6954010002            9    3.5
   [10,] 6954010002          12    3.5",header=TRUE)

#you claim to have a matrix
m <- as.matrix(DF)

#turn the matrix into a data.frame
DF <- as.data.frame(m)
rownames(DF) <- NULL

#use package plyr to split according to patient, 
#apply function, and combine back
library(plyr)
#calculate the cumulative sum of differences in STATUS
#put a 0 in front, since there can be no progress at the first time point
DF <- ddply(DF,.(PN),transform,progress=c(0,cumsum(diff(STATUS))))

print(DF)
#            PN time.state.2 STATUS progress
# 1  6954010001            0    3.0      0.0
# 2  6954010001            3    3.5      0.5
# 3  6954010001            6    3.5      0.5
# 4  6954010001            9    3.5      0.5
# 5  6954010001           12    3.5      0.5
# 6  6954010002            0    3.0      0.0
# 7  6954010002            3    3.0      0.0
# 8  6954010002            6    3.5      0.5
# 9  6954010002            9    3.5      0.5
# 10 6954010002           12    3.5      0.5

明確化後に編集:

DF <- read.table(text="         PN        time.state.2 STATUS
[1,] 6954010001            0    3.0
[2,] 6954010001            3    3.5
[3,] 6954010001            6    4.0
[4,] 6954010001            9    3.5
[5,] 6954010001           12    6.0
[6,] 6954010002            0    3.0
[7,] 6954010002            3    4.0
[8,] 6954010002            6    4.0
[9,] 6954010002            9    6.0
[10,] 6954010002          12    6.0",header=TRUE)

rownames(DF) <- NULL

DF <- ddply(DF,.(PN),transform,progress=(STATUS-STATUS[1])>=1 & 
                                        (c(STATUS[-1],FALSE)-STATUS[1])>=1)

DF <- ddply(DF,.(PN),function(x) {x$progress[x$progress][-1] <- FALSE; x})

#            PN time.state.2 STATUS progress
# 1  6954010001            0    3.0    FALSE
# 2  6954010001            3    3.5    FALSE
# 3  6954010001            6    4.0    FALSE
# 4  6954010001            9    3.5    FALSE
# 5  6954010001           12    6.0    FALSE
# 6  6954010002            0    3.0    FALSE
# 7  6954010002            3    4.0     TRUE
# 8  6954010002            6    4.0    FALSE
# 9  6954010002            9    6.0    FALSE
# 10 6954010002           12    6.0    FALSE
于 2013-05-11T13:27:39.927 に答える