2015-07-28 98 views
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的右边的所有列?

回答

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)