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$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)

また、IDの種類は60,000種類以上あります。また、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解決策はこれよりも効率的かもしれません。

EDIT修正されたソリューションで、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 に答える