1
我有一个包含案例观察的数据集。实际上,每个案例都在10个不同的时间段(P1到P10)进行观察,并且可以在每个时间段处于5个状态(1到5)之一。根据列索引和其他值填充变量
每个案例在P1处于状态1。一个案件只能从状态1进展到2到3等,并且必须从1传递到2,然后传递给3等。在观察期间,案件不一定会改变状态。
在我的数据集中,我有每个案例在P1和P10的状态,并且还知道每个状态达到每个状态的时间(S2到S5,例如S2的值为5意味着状态2中的第一个观察结果在P5中)。
我的数据是这样如下:
# Create test dataset #
test <- as.data.frame(c(1:8))
names(test) <- "Obs"
test$P1 <- 1
for (i in 2:9){
test[[paste("P",i,sep="")]] <- NA
}
test$P10 <- c(1,5,3,2,2,5,5,4)
test$S2 <- c(NA,2,4,9,7,3,3,2)
test$S3 <- c(NA,5,8,NA,NA,4,4,3)
test$S4 <- c(NA,7,NA,NA,NA,5,8,5)
test$S5 <- c(NA,9,NA,NA,NA,10,9,NA)
我想观察P2的序列重建至P9的每一种情况下,填补空白,可以这么说。我尝试以下:
func <- function(base){
for(i in 1:nrow(base)){
if (is.na(base$S5[i])) {
for (j in 2:9){
base[[paste("P", j, sep="")]] <- NA
}
}
else {
for (j in 2:base$S5[i]){
base[[paste("P", j, sep="")]] <- 5
}
}
}
base
}
test <- func(test)
我想填充所有裨列,其中i = < S5与5.值然后做为S4,S3和S2相同。所需的结果是:
Obs P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 S2 S3 S4 S5
1 1 1 1 1 1 1 1 1 1 1 1 NA NA NA NA
2 2 1 2 2 2 3 3 4 4 5 5 2 5 7 9
3 3 1 1 1 2 2 2 2 3 3 3 4 8 NA NA
4 4 1 1 1 1 1 1 1 1 2 2 9 NA NA NA
5 5 1 1 1 1 1 1 2 2 2 2 7 NA NA NA
6 6 1 1 2 3 4 4 4 4 4 5 3 4 5 10
7 7 1 1 1 2 3 3 3 4 5 5 4 5 8 9
8 8 1 2 3 3 4 4 4 4 4 5 2 3 5 NA
作为另外,一旦最后的过渡已经发生了的情况下,我想所有下面的值是虚值9:
Obs P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 S2 S3 S4 S5
1 1 1 9 9 9 9 9 9 9 9 9 NA NA NA NA
2 2 1 2 2 2 3 3 4 4 5 9 2 5 7 9
3 3 1 1 1 2 2 2 2 3 9 9 4 8 NA NA
4 4 1 1 1 1 1 1 1 1 2 9 9 NA NA NA
5 5 1 1 1 1 1 1 2 9 9 9 7 NA NA NA
6 6 1 1 2 3 4 9 9 9 9 5 3 4 5 10
7 7 1 1 1 2 3 3 3 4 5 9 4 5 8 9
8 8 1 2 3 3 4 4 4 4 4 5 2 3 5 NA
对于这最后部分我可以使用:
for(i in 1:nrow(test)){
test$last_chg[i] <- ifelse(is.na(test$S2[i]),NA,max(test[i,c(12:15)], na.rm=T))
}
获取最后一次状态变化的列索引,但是如何填充9的右边的所有列?