我正在开发一个用于生存分析的审查因变量。我的目标是找到某人在调查中回答问题的最后时间(“时间”)(例如,“q.time”被编码为“1”,“q.time+1”和 q随后的时间被编码为“0”)。
按照这个逻辑,最后回答的问题应该编码为“1”(q.time)。第一个未回答的问题 (q.time+1) 应编码为“0”。第一个未回答的问题之后的所有问题都应编码为“NA”。然后我想从我的数据集中删除 DV=NA 的所有行。
一位非常慷慨的同事帮助我开发了以下代码,但他现在正在休假,需要更多的爱。代码如下:
library(plyr) # for ddply
library(stats) # for reshape(...)
# From above
dat <- data.frame(
id=c(1, 2, 3, 4),
q.1=c(1, 1, 0, 0),
q.2=c(1, 0, 1, 0),
dv.1=c(1, 1, 1, 1),
dv.2=c(1, 1, 0, 1))
# From above
long <- reshape(dat,
direction='long',
varying=c('q.1', 'q.2', 'dv.1', 'dv.2'))
ddply(long, .(id), function(df) {
# figure out the dropoff time
answered <- subset(df, q == 1)
last.q = max(answered$time)
subs <- subset(df, time <= last.q + 1)
# set all the dv as desired
new.dv <- rep(last.q,1)
if (last.q < max(df$time)) new.dv <- c(0,last.q)
subs$dv <- new.dv
subs
})
不幸的是,这会产生错误消息:
"Error in `$<-.data.frame`(`*tmp*`, "dv", value = c(0, -Inf)) :
replacement has 2 rows, data has 0"
有任何想法吗?问题似乎出在“rep”命令中,但我是 R 的新手。非常感谢!
更新:请参阅下面的解释,然后参考后续问题
您好-我完全关注您,非常感谢您花时间帮助我。我回到我的数据中并在一个虚拟 Q 中编码,其中所有受访者的值都为“1” - 但是,发现错误可能真正出在哪里。在我的真实数据集中,我有 30 个问题(即,长格式 30 次)。在我更改数据集后,确保所有 id 变量的 q==1,错误消息变为说
"Error in `$<-.data.frame`(`*tmp*`, "newvar", value = c(0, 29)) : replacement has 2 rows, data has 31"
如果问题出在分配给 subs 的行数上,那么错误的根源来自...
subs <- subset(df, time <= last.q + 1)
即,$
time <= last.q + 1$
将行数设置为等于 last.q+1 的值?
更新 2:理想情况下,我希望我的新变量看起来像什么!
id time q dv
1 1 1 1
1 2 1 1
1 3 1 1
1 4 1 1
1 5 0 0
1 6 0 NA
2 1 1 1
2 2 1 1
2 3 0 0
2 4 0 NA
2 5 0 NA
2 6 0 NA
请注意,“q”可以随时间在“0”或“1”之间变化(参见时间=2 时 id=1 的观察结果),但由于生存分析的性质,“dv”不能。我需要做的是创建一个变量,找出“q”在“1”和“0”之间变化的最后时间,然后进行相应的审查。在第 4 步之后,我的数据应如下所示:
id time q dv
1 1 1 1
1 2 1 1
1 3 1 1
1 4 1 1
2 1 1 1
2 2 1 1
2 3 0 0