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

R 复杂的长到宽数据转换(具有时变变量),r,reshape,R,Reshape,我目前正在研究一个“长”形式的多状态分析数据集(每个个体的观察值为一行;每个个体重复测量多达5次) 其思想是,每个个体都可以在时变状态变量s=1、2、3、4的级别上反复转换。我拥有的所有其他变量(这里是队列)都固定在任何给定的id中 经过一些分析之后,我需要根据访问状态的特定顺序,以“宽”的形式重塑数据集。以下是初始长数据的示例: dat <- read.table(text = " id cohort s 1 1

我目前正在研究一个“长”形式的多状态分析数据集(每个个体的观察值为一行;每个个体重复测量多达5次)

其思想是,每个个体都可以在时变状态变量
s=1、2、3、4的级别上反复转换。我拥有的所有其他变量(这里是
队列
)都固定在任何给定的
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)     
我试图使用
重塑()
,并将重点放在转置
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
是在每个不同的访问状态中花费的时间

你能帮我达到这个数据结构吗?我认为在使用
restrape()
之前,有必要在中间样本中创建所有
dur
-和
s
-变量。否则,可能直接采用
-reforme2-

好的

library(plyr)
library(reshape2)

dat2 <- ddply(dat,.(id,cohort), function(x) 
       data.frame(s=x$s,name=paste0("s",seq_along(x$s))))


dat2 <- ddply(dat2,.(id,cohort), function(x) 
       dcast(x, id + cohort ~ name, value.var= "s" ,fill= 0)
       )

dat2[is.na(dat2)] <- 0

dat2

#    id cohort s1 s2 s3 s4 s5
#    1  1      1  2  2  1  4  0
#    2  2      3  1  1  3  0  0
#    3  3      2  1  2  3  3  4
库(plyr)
图书馆(E2)
dat2ok

库(plyr)
图书馆(E2)
dat2
然后使用以下行给出您的姓名:

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
我怀疑有一些方法可以避免创建
period
变量,避免直接在
wide
语句中替换
NA
,但我还没有弄清楚这些方法

然后使用以下行给出您的姓名:

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

尝试以下方法:

library(reshape2)

dat$seq <- ave(dat$id, dat$id, FUN = function(x) paste0("s", seq_along(x)))
dat.s <- dcast(dat, id + cohort ~ seq, value.var = "s", fill = 0)
如果您不介意仅使用1、2、…、5作为列名,则可以将
ave
行缩短为:

dat$seq <- ave(dat$id, dat$id, FUN = seq_along)
试试这个:

library(reshape2)

dat$seq <- ave(dat$id, dat$id, FUN = function(x) paste0("s", seq_along(x)))
dat.s <- dcast(dat, id + cohort ~ seq, value.var = "s", fill = 0)
如果您不介意仅使用1、2、…、5作为列名,则可以将
ave
行缩短为:

dat$seq <- ave(dat$id, dat$id, FUN = seq_along)

基本上是
direction=wide
选项,但我不能真正创建新的“有序”变量集。基本上是
direction=wide
选项,但我不能真正创建新的“有序”变量集。。
> dat.s
  id cohort s1 s2 s3 s4 s5
1  1      1  2  2  1  4  0
2  2      3  1  1  3  0  0
3  3      2  1  2  3  3  4
dat$seq <- ave(dat$id, dat$id, FUN = seq_along)
library(plyr)
dur.fn <- function(x) {
  r <- rle(x$s)$length
  data.frame(id = x$id[1], dur.value = r, dur.seq = paste0("dur", seq_along(r)))
}
dat.dur.long <- ddply(dat, .(id), dur.fn)
dat.dur <- dcast(dat.dur.long, id ~ dur.seq, c, value.var = "dur.value", fill = 0)
cbind(dat.s, dat.dur[-1])
  id cohort s1 s2 s3 s4 s5 dur1 dur2 dur3 dur4
1  1      1  2  2  1  4  0    2    1    1    0
2  2      3  1  1  3  0  0    2    1    0    0
3  3      2  1  2  3  3  4    1    1    2    1