我正在开发一个审查因变量,用于生存分析。我的目标是找出某人在调查中回答问题的最后时间(“时间”)(例如,“q.time”被编码为“1”,“q.time + 1”和q后续时间编码为“0”)。疑难解答ddply()脚本
通过这个逻辑,最后回答的问题应该被编码为“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的新手。非常感谢!
UPDATE:请参阅以下解释,然后参照后续问题
您好,我完全跟着你,真的很感谢你了,帮我出时间。我回到我的数据中,并编写了一个虚拟Q,其中所有受访者都具有“1”的值 - 但是,发现错误真的可能在哪里。在我的真实数据集中,我有30个问题(即30个长格式)。我改变了数据集经过这么肯定q == 1对所有ID的变量,该错误信息更改为说
"Error in `$<-.data.frame`(`*tmp*`, "newvar", value = c(0, 29)) : replacement has 2 rows, data has 31"
如果问题是与分配给潜艇的行数,则是错误的根源从未来...
subs <- subset(df, time <= last.q + 1)
即$
时间< = 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”随着时间的推移(参见ID = 1的观察在时间= 2),但由于生存分析的性质, “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
一个小问题,'reshape2'软件包不包含'reshape',这是'stats' pacakge。 – mnel 2012-07-12 02:06:34
谢谢!修正:) – roody 2012-07-12 13:01:02