我目前正在研究"长"形式的多态分析数据集(每个人观察一行;每个人最多重复测量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-?
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变量并避免NA在wide语句中直接替换,但我还没有想出那些.