1

次のデータフレームがあります。

id<-c(1,1,1,1,1,3,3,3,3)
period<-c("calib","calib","calib","valid","valid","calib","calib","calib","valid")
date<-c("11-11-07","11-11-07","23-11-07","12-12-08","17-12-08","11-11-07","23-11-07","23-11-07","16-01-08")
time<-c(12,13,14,11,23,15,12,18,14)
df<-data.frame(id,period,time,date)
df$date2<-as.Date(as.character(df$date), format = "%d-%m-%y")


id period time     date      date2
 1  calib   12 11-11-07 2007-11-11
 1  calib   13 11-11-07 2007-11-11
 1  calib   14 23-11-07 2007-11-23
 1  valid   11 12-12-08 2008-12-12
 1  valid   23 17-12-08 2008-12-17
 3  calib   15 11-11-07 2007-11-11
 3  calib   12 23-11-07 2007-11-23
 3  calib   18 23-11-07 2007-11-23
 3  valid   14 16-01-08 2008-01-16

期間date内の最後のトランザクションのをそれぞれについて抽出し、新しい列に配置する必要があります。1日に2つのトランザクションが行われた場合(同様)、最後のトランザクションはトランザクションの時間に基づいて選択する必要があります。私が探しているファイナルテーブルは次のとおりです。calibiddate

id period time     date      date2  last
 1  calib   12 11-11-07 2007-11-11   NA
 1  calib   13 11-11-07 2007-11-11   NA
 1  calib   14 23-11-07 2007-11-23 2007-11-23
 1  valid   11 12-12-08 2008-12-12   NA
 1  valid   23 17-12-08 2008-12-17   NA 
 3  calib   15 11-11-07 2007-11-11   NA
 3  calib   12 23-11-07 2007-11-23   NA
 3  calib   18 23-11-07 2007-11-23 2007-11-23
 3  valid   14 16-01-08 2008-01-16   NA

誰かがこれを手伝ってくれませんか?!

4

1 に答える 1

1

これは私が問題に取り組む方法ですrle

L1 <- lapply(split(df, df[, "id"]), function(dat){
    dat[, "last"] <- as.Date(NA)
    x <- rle(as.character(dat[, "period"]))
    z <- cumsum(x[["lengths"]])
    dat$last[z[x[["values"]] == "calib"]] <- dat[z[x[["values"]] == "calib"] , 
        "date2"]
    dat
})

data.frame(do.call(rbind, L1), row.names = NULL)
于 2012-08-27T03:04:04.620 に答える