我正在开发一个用于生存分析的审查因变量。我的目标是找到某人在调查中回答问题的最后时间(“时间”)(例如,“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