0

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

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

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

此外,还有超过60,000种ID。并且,examineData 中的同一个 ID 中没有重复的日期

4

2 回答 2

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解决方案可能比这更有效。

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

#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
于 2013-11-06T10:48:44.280 回答
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

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

于 2013-11-06T10:58:27.170 回答