我试图根据最新状态找出(猜测)当前状态。
假设我们有以下数据框(它是真实数据的缩写)
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$Date
与examinData$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中没有重复的日期答案 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
您可以为缺失值构建一些“更正”,但是由于您没有指定任何值,这是干净的方法。