根据列索引和其他值填充变量

时间:2015-07-28 07:45:17

标签: r

我有一个包含案例观察的数据集。实际上,每个案例都是在十个不同的时间段(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填充右侧的所有列?

1 个答案:

答案 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)