0

これが個人のデータですid = 1

id time status
--------------
1  t    status

tはあるイベントまでの時間であり、イベントが発生したか発生しなかったstatusかのいずれかです(この場合は調査期間です)。10t

tとの間にあるa2と言いますa3

私の目標は、データを次のように変換することです。

id period start stop status
---------------------------
1  1     0     a1   0      
1  2     a1    a2   0      
1  3     a2    t    status  

個人1の合計時間は、イベントがない3つの間隔に分割されます(0, a1)(a1, a2)

質問

データセットとベクトルを入力し、変換されたデータセットを出力するR関数を効率的に作成する方法を考えられますa=(a1, a2, ..., aK)か?


編集

パート1 具体的な例を聞いてきました。これが1つです:

    id time status
    --------------
    1  5    1

およびa1=1、、。a2=3_a3=7

パート2私も自分の試みを示すように頼まれました。ここにあります

> data <- data.frame(id=1, time=5, status=1)
> a <- c(1, 3, 7)
> N <- nrow(data)
> data$period <- ifelse(data$time < a[1], 1,
+                       ifelse(data$time < a[2], 2,
+                              ifelse(data$time < a[3], 3, 4)))
> 
> 
> dataTemp1 <- data.frame(matrix(nrow=N, ncol=ncol(data)))
> names(dataTemp1) <- names(data)
> dataTemp2 <- data.frame(matrix(nrow=N, ncol=ncol(data)))
> names(dataTemp2) <- names(data)
> dataTemp3 <- data.frame(matrix(nrow=N, ncol=ncol(data)))
> names(dataTemp3) <- names(data)
> dataTemp4 <- data.frame(matrix(nrow=N, ncol=ncol(data)))
> names(dataTemp4) <- names(data)
> 
> for(j in 1:N)
+ {
+   if(data[j, "period"] == 1){
+     data[j, "start"] <- 0
+     data[j, "stop"] <- data[j, "time"]
+   } else if(data[j, "period"] == 2){
+     dataTemp1[j, c("id", "time", "period")] <-
+       data[j, c("id", "time", "period")]
+     dataTemp1[j, "start"] <- 0
+     dataTemp1[j, "stop"] <- a[1]
+     dataTemp1[j, "status"] <- 0
+     
+     data[j, "start"] <- a[1]
+     data[j, "stop"] <- data[j, "time"] 
+   } else if(data[j, "period"] == 3){
+     dataTemp1[j, c("id", "time", "period")] <-
+       data[j, c("id", "time", "period")]
+     dataTemp1[j, "start"] <- 0
+     dataTemp1[j, "stop"] <- a[1]
+     dataTemp1[j, "status"] <- 0
+     
+     dataTemp2[j, c("id", "time", "period")] <-
+       data[j, c("id", "time", "period")]
+     dataTemp2[j, "start"] <- a[1]
+     dataTemp2[j, "stop"] <- a[2]
+     dataTemp2[j, "status"] <- 0
+     
+     data[j, "start"] <- a[2]
+     data[j, "stop"] <- data[j, "time"]     
+   } else if(data[j, "period"] == 4){
+     dataTemp1[j, c("id", "time", "period")] <-
+       data[j, c("id", "time", "period")]
+     dataTemp1[j, "start"] <- 0
+     dataTemp1[j, "stop"] <- a[1]
+     dataTemp1[j, "status"] <- 0
+     
+     dataTemp2[j, c("id", "time", "period")] <-
+       data[j, c("id", "time", "period")]
+     dataTemp2[j, "start"] <- a[1]
+     dataTemp2[j, "stop"] <- a[2]
+     dataTemp2[j, "status"] <- 0
+     
+     dataTemp3[j, c("id", "time", "period")] <-
+       data[j, c("id",  "time", "period")]
+     dataTemp3[j, "start"] <- a[2]
+     dataTemp3[j, "stop"] <- a[3]
+     dataTemp3[j, "status"] <- 0
+     
+     data[j, "start"] <- a[3]
+     data[j, "stop"] <- data[j, "time"] 
+   }
+ }
> 
> dataTemp1 <- dataTemp1[complete.cases(dataTemp1), ]
> dataTemp2 <- dataTemp2[complete.cases(dataTemp2), ]
> dataTemp3 <- dataTemp3[complete.cases(dataTemp3), ]
> dataTemp4 <- dataTemp4[complete.cases(dataTemp4), ]
> 
> data <- rbind(data, dataTemp1, dataTemp2, dataTemp3, dataTemp4)
> data[, "period"] <- ifelse(data[, "start"] == 0, 1,
+                            ifelse(data[, "start"] == a[1], 2,
+                                   ifelse(data[, "start"] == a[2], 3,
+                                          ifelse(data[, "start"] == a[3], 4,
+                                                 5))))
> data <- data[order(data$id, data$start),
+              c("id", "period", "start", "stop", "status")]
> data
  id period start stop status
2  1      1     0    1      0
3  1      2     1    3      0
1  1      3     3    5      1
4

1 に答える 1

0

私はそれを適切な再現可能な解決策として書きます:

df <- data.frame( id=1, time=5, status=2)
a <- c(1, 3, 7)

res.fn <- function(df, a) {
    id <- rep(1, length(a))
    period <- 1:length(a)
    start <- c(0, a[1:(length(a)-1)])
    stop <- c(a[1:(length(a)-1)], df$time)
    status <- c(rep(0, length(a)-1), df$status)
    data.frame(id, period, start, stop, status)
}
> res.fn(df, a)

  id period start stop status
1  1      1     0    1      0
2  1      2     1    3      0
3  1      3     3    5      2
于 2013-01-15T15:44:08.517 に答える