复杂的长到宽数据转换(具有时变变量)

Ste*_*rdi 1 r reshape

我目前正在研究"长"形式的多态分析数据集(每个人观察一行;每个人最多重复测量5次).

这个想法是每个人都可以在时变状态变量 的水平上反复转换s = 1, 2, 3, 4.我所拥有的所有其他变量(此处cohort)都在任何给定的范围内固定id.

经过一些分析,我需要根据访问状态的具体顺序,以"宽"形式重塑数据集.以下是初始长数据的示例:

  dat <- read.table(text = "

        id    cohort    s    
        1       1       2
        1       1       2
        1       1       1
        1       1       4
        2       3       1
        2       3       1
        2       3       3
        3       2       1
        3       2       2
        3       2       3
        3       2       3
        3       2       4", 

    header=TRUE)     
Run Code Online (Sandbox Code Playgroud)

最后的"宽"的数据集应考虑到访问的状态,记录到新创建的变量的具体各个序列s1,s2,s3,s4,s5,其中s1在第一状态由个别走访等.

根据上面的示例,宽数据集看起来像:

    id    cohort    s1    s2    s3    s4    s5    
    1       1       2      2     1     4     0
    2       3       1      1     3     0     0
    3       2       1      2     3     3     4
Run Code Online (Sandbox Code Playgroud)

我试图使用reshape(),也专注于转置s,但没有预期的结果.实际上,我对R功能的了解非常有限.你能给出任何建议吗?谢谢.

编辑:获取不同类型的宽数据集

谢谢大家的帮助,如果可以,我有一个相关的问题.特别是当长时间观察每个人并且跨越状态的过渡很少时,dat以这种替代方式重塑初始样本非常有用:

    id    cohort    s1    s2    s3    s4    s5    dur1  dur2  dur3  dur4  dur5 
    1       1       2      1     4     0     0      2     1     1     0     0  
    2       3       1      3     0     0     0      2     1     0     0     0
    3       2       1      2     3     4     0      1     1     2     1     0
Run Code Online (Sandbox Code Playgroud)

现在在实践中s1- s5不同的访问状态,以及dur1- dur5在每个相应的不同访问状态中花费的时间.

您能否帮助实现这一数据结构?我认为有必要在使用之前在中间样本中创建所有dur- 和s- 变量reshape().否则也许有可能直接采用-reshape2-

Mar*_*ler 5

dat <- read.table(text = "
        id    cohort    s    
        1       1       2
        1       1       2
        1       1       1
        1       1       4
        2       3       1
        2       3       1
        2       3       3
        3       2       1
        3       2       2
        3       2       3
        3       2       3
        3       2       4", 
    header=TRUE)     

df <- data.frame(
    dat,
    period = sequence(rle(dat$id)$lengths) 
)

wide <- reshape(df, v.names = "s", idvar = c("id", "cohort"),
                timevar = "period", direction = "wide")

wide[is.na(wide)] = 0
wide
Run Code Online (Sandbox Code Playgroud)

得到:

  id cohort s.1 s.2 s.3 s.4 s.5
1  1      1   2   2   1   4   0
5  2      3   1   1   3   0   0
8  3      2   1   2   3   3   4
Run Code Online (Sandbox Code Playgroud)

然后使用以下行给出你的名字:

names(wide) <- c('id','cohort', paste('s', seq_along(1:5), sep=''))

#   id cohort s1 s2 s3 s4 s5
# 1  1      1  2  2  1  4  0
# 5  2      3  1  1  3  0  0
# 8  3      2  1  2  3  3  4
Run Code Online (Sandbox Code Playgroud)

如果sep=''wide语句中使用,则不必重命名变量:

wide <- reshape(df, v.names = "s", idvar = c("id", "cohort"),
                timevar = "period", direction = "wide", sep='')
Run Code Online (Sandbox Code Playgroud)

我怀疑有办法避免创建period变量并避免NAwide语句中直接替换,但我还没有想出那些.