0

次のデータセットを で再形成しようとしていますがreshape()、あまり結果が得られません。

開始データセットは「ワイド」形式で、各 ID が 1 行で記述されます。データセットは、マルチステート分析 (生存分析の一般化) を実行するために採用されることを意図しています。

各人物は、指定された全体の期間にわたって記録されます。この期間中、被験者は複数の状態間の遷移を経験することができます (簡単にするために、訪問できる個別の状態の最大数を 2 に固定します)。最初に訪れた州はs1 = 1, 2, 3, 4です。dur1人は一定期間その州内に滞在し、同じことが 2 番目に訪れた州にも適用されs2ます。

   id    cohort    s1     dur1     s2     dur2     
     1      1        3      4       2      5       
     2      0        1      4       4      3    

私が取得したい長い形式のデータセットは次のとおりです。

id    cohort    s    
1       1       3
1       1       3
1       1       3
1       1       3
1       1       2
1       1       2
1       1       2
1       1       2
1       1       2
2       0       1
2       0       1
2       0       1
2       0       1
2       0       4
2       0       4
2       0       4

実際には、各 ID にはdur1 + dur2行があり、s1s2が 1 つの変数に溶け込んでいますs

この変換をどのように行いますか?また、元のデータセットの「ワイド」フォームにどのように戻りますか?

どうもありがとう!

dat <- cbind(id=c(1,2), cohort=c(1, 0), s1=c(3, 1), dur1=c(4, 4), s2=c(2, 4), dur2=c(5, 3))
4

2 に答える 2

3

最初のステップには使用できますreshape()が、その後、さらに作業を行う必要があります。また、入力としてreshape()a が必要data.frame()ですが、サンプル データは行列です。

続行する方法は次のとおりです。

  1. reshape()ワイドからロングまでのデータ:

    dat2 <- reshape(data.frame(dat), direction = "long", 
                    idvar = c("id", "cohort"),
                    varying = 3:ncol(dat), sep = "")
    dat2
    #       id cohort time s dur
    # 1.1.1  1      1    1 3   4
    # 2.0.1  2      0    1 1   4
    # 1.1.2  1      1    2 2   5
    # 2.0.2  2      0    2 4   3
    
  2. data.frameを使用して結果を「展開」しますrep()

    dat3 <- dat2[rep(seq_len(nrow(dat2)), dat2$dur), c("id", "cohort", "s")]
    dat3[order(dat3$id), ]
    #         id cohort s
    # 1.1.1    1      1 3
    # 1.1.1.1  1      1 3
    # 1.1.1.2  1      1 3
    # 1.1.1.3  1      1 3
    # 1.1.2    1      1 2
    # 1.1.2.1  1      1 2
    # 1.1.2.2  1      1 2
    # 1.1.2.3  1      1 2
    # 1.1.2.4  1      1 2
    # 2.0.1    2      0 1
    # 2.0.1.1  2      0 1
    # 2.0.1.2  2      0 1
    # 2.0.1.3  2      0 1
    # 2.0.2    2      0 4
    # 2.0.2.1  2      0 4
    # 2.0.2.2  2      0 4 
    

を使用して、ファンキーな行名も取り除くことができますrownames(dat3) <- NULL

更新: 元のフォームに戻す機能の保持

上記の例では、「time」変数と「dur」変数を削除したため、元のデータセットに直接戻すことはできません。これを行う必要があると思われる場合は、それらの列を保持し、data.frame必要に応じて必要な列のサブセットで別の列を作成することをお勧めします。

方法は次のとおりです。

aggregate()「dat2」に戻るために使用します。

aggregate(cbind(s, dur) ~ ., dat3, unique)
#   id cohort time s dur
# 1  2      0    1 1   4
# 2  1      1    1 3   4
# 3  2      0    2 4   3
# 4  1      1    2 2   5

それを折り返しreshape()て「dat1」に戻ります。ここでは、1 つのステップで:

reshape(aggregate(cbind(s, dur) ~ ., dat3, unique), 
        direction = "wide", idvar = c("id", "cohort"))
#   id cohort s.1 dur.1 s.2 dur.2
# 1  2      0   1     4   4     3
# 2  1      1   3     4   2     5
于 2013-01-11T15:12:57.850 に答える
1

おそらくもっと良い方法がありますが、これはうまくいくかもしれません。

df <- read.table(text = '
   id    cohort    s1     dur1     s2     dur2     
     1      1        3      4       2      5       
     2      0        1      4       4      3',
header=TRUE)

hist <- matrix(0, nrow=2, ncol=9)
hist

for(i in 1:nrow(df)) {

hist[i,] <- c(rep(df[i,3], df[i,4]), rep(df[i,5], df[i,6]), rep(0, (9 - df[i,4] - df[i,6])))

}

hist

hist2 <- cbind(df[,1:2], hist)
colnames(hist2) <- c('id', 'cohort', paste('x', seq_along(1:9), sep=''))

library(reshape2)

hist3 <- melt(hist2, id.vars=c('id', 'cohort'), variable.name='x', value.name='state')

hist4 <- hist3[order(hist3$id, hist3$cohort),]
hist4

hist4 <- hist4[ , !names(hist4) %in% c("x")]

hist4 <- hist4[!(hist4[,2]==0 & hist4[,3]==0),]

与えます:

   id cohort state
1   1      1     3
3   1      1     3
5   1      1     3
7   1      1     3
9   1      1     2
11  1      1     2
13  1      1     2
15  1      1     2
17  1      1     2
2   2      0     1
4   2      0     1
6   2      0     1
8   2      0     1
10  2      0     4
12  2      0     4
14  2      0     4

もちろん、ID ごとに 2 つ以上の州がある場合は、これを変更する必要があります (2 つ以上のコホートがある場合は、変更する必要がある場合があります)。たとえば、サンプル期間が 9 の場合、1 人が次のような一連の状態になる可能性があるとします。

1 3 2 4 3 4 1 1 2
于 2013-01-11T13:11:04.017 に答える