我有一个包含案例观察的数据集。实际上,每个案例都是在十个不同的时间段(P1到P10)观察到的,并且在每个时期都可以处于5个州(1到5)之一。
每个案例都在P1的州1。一个案例只能从状态1进展到2到3等,并且在传递到3等之前必须从1传递到2等。案例不一定在观察期间改变状态。
在我的数据集中,我得知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)
我想填充所有Pi列,其中i&lt; = 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填充右侧的所有列?
答案 0 :(得分:0)
我终于找到了一个有效的解决方案:
# Create temporary variables #
test3$temp_P1 <- NA
test3$temp_P2 <- NA
test3$temp_P3 <- NA
test3$temp_P4 <- NA
test3$temp_P5 <- NA
test3$temp_P6 <- NA
test3$temp_P7 <- NA
test3$temp_P8 <- NA
test3$temp_P9 <- NA
test3$temp_P10 <- NA
test3$temp_P11 <- NA
# Function #
func5 <- function(base){
for (k in 5:2){
for (z in 2:10){
for(i in 1:nrow(base)) {
if (isTRUE(base[[paste("S",k,sep="")]][i]==z)) {
for (j in match("temp_P2",names(base)):match(paste("temp_P",z,sep=""),names(base))){
base[i,j-1] <- k-1
base[i,j] <- k
}
} else {
for (j in match("temp_P2",names(base)):match("temp_P10",names(base))){
base[i,j-1] <- base[i,j-1]
base[i,j] <- base[i,j]
}
}
}
}
}
base
}
test3 <- func5(test3)
# Replace P2-P9 with correct values #
test3[is.na(test3)] <- -9
for (i in 2:9) {
test3[[paste("P",i,sep="")]] <- test3[[paste("temp_P",i,sep="")]]
}
test3$P10 <- ifelse(test3$P9 == -9, -9, test3$P10)
test3$P10 <- ifelse(test3$P9 == test3$P10, -9, test3$P10)