如何根据R中的日期获得最新值?

时间:2013-11-06 08:49:07

标签: r dataframe

我试图根据最新状态找出(猜测)当前状态。

假设我们有以下数据框(它是真实数据的缩写)

examineData
ID      Date            Status_Value
A       2012-01-01      100
A       2012-01-10      200
A       2012-02-20      500
B       2012-01-01      1100
B       2012-01-10      1200
B       2012-02-20      1500
C       2012-01-01      2100
C       2012-01-10      2200
C       2012-02-20      2500

在上面,A,B和C是具有status_value的对象。 Status_values在日期进行了检查。

asked
ID      Date
A       2012-01-09
A       2012-02-28
B       2012-02-19
C       2012-01-10

但是,有人在特定日期询问了A,B和C的状态(可能会更少)。

如您所见,某些asked$DateexaminData$Date不匹配。

在这种情况下,我们决定从examineData$Date获得最新数据。

ID      Date            Status_Value
A       2012-01-09      100
A       2012-02-28      500
B       2012-02-19      1200
C       2012-01-10      2200

你能给我一个示例代码吗? (速度很重要 - 1,600,000行examineData,110,000行asked

此外,还有超过6万种身份证。并且,在examineData

中的相同ID中没有重复的日期

2 个答案:

答案 0 :(得分:1)

这似乎有效:

examineData$Date <- as.Date(examineData$Date, format = "%Y-%m-%d")
asked$Date <- as.Date(asked$Date, format = "%Y-%m-%d")

#res <- unlist(lapply(split(examineData, examineData$ID),
#             function(x) { merged <- c(x$Date, asked$Date[asked$ID == unique(x$ID)]) ;
#                     x$Status_Value[which(order(merged) %in% length(merged)) - 1] }))

我想,data.table解决方案可能比这更有效。

编辑修改后的解决方案,现在提供 - asked中可能存在重复的ID:

#dates should, still, be turned into actual dates if they aren't

#function to (m)apply over asked
fun <- function(id, date) 
{ 
 subsetted_examineData <- examineData[examineData$ID == id,]

 merged <- c(subsetted_examineData$Date, date)

 res <- subsetted_examineData$Status_Value[which(order(merged) %in% length(merged)) -1]

 return(res)
}

res <- mapply(fun, asked$ID, asked$Date)

res
#   A    A    B    C 
# 100  500 1200 2200 
cbind(asked, Status_Value = unname(res))                            
#  ID       Date Status_Value
#1  A 2012-01-09          100
#2  A 2012-02-28          500
#3  B 2012-02-19         1200
#4  C 2012-01-10         2200

答案 1 :(得分:0)

sel <- vector()
for(i in 1:length(unique(examineData$ID))){
  id  <- unique(examineData$ID)[i]
  set <- subset(examineData,ID==id)
  dif <- asked[asked$ID==id,"Date"] - set$Date
  dif[dif<0] <- NA
  sel[i] <- row.names(set)[which.min(dif)]
}
examineData[sel,]

要得到这个

  ID       Date Status_Value
1  A 2012-01-01          100
5  B 2012-01-10         1200
8  C 2012-01-10         2200

您可以为缺失值构建一些“更正”,但是由于您没有指定任何值,这是干净的方法。