复杂的从长到宽的数据转换(具有时变变量) [英] Complex long to wide data transformation (with time-varying variable)

查看:11
本文介绍了复杂的从长到宽的数据转换(具有时变变量)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在处理"长"形式的多态分析数据集(每个人的观察结果占一行;每个人最多重复测量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)     

最终的"宽"数据集应考虑访问状态的特定个体序列,并记录到新创建的变量s1s2s3s4s5中,其中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

我尝试使用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

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

您能帮我达到这个数据结构吗?我认为在使用reshape()之前,有必要在中间样本中创建所有的durs变量。否则也许可以直接采用-reshape2-

推荐答案

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

给予:

  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

然后使用以下行提供您的姓名:

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

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

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

我怀疑有一些方法可以避免创建period变量并避免在wide语句中直接替换NA,但我还没有弄清楚这些方法。

这篇关于复杂的从长到宽的数据转换(具有时变变量)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆