我正在開發一個審查因變量,用於生存分析。我的目標是找出某人在調查中回答問題的最後時間(「時間」)(例如,「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