2015-07-28 39 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)