R在另一个数据帧上应用一个数据帧

R在另一个数据帧上应用一个数据帧,r,plyr,apply,R,Plyr,Apply,我有两个数据帧 set.seed(1234) df <- data.frame( id = factor(rep(1:24, each = 10)), price = runif(20)*100, quantity = sample(1:100,240, replace = T) ) df2 <- data.frame( id = factor(seq(1:24)), eq.quantity = sample(1:100

我有两个数据帧

set.seed(1234)
df <- data.frame( 
  id       = factor(rep(1:24, each = 10)),
  price    = runif(20)*100,
  quantity = sample(1:100,240, replace = T)
  )

df2 <- data.frame(
  id          = factor(seq(1:24)),
  eq.quantity = sample(1:100, 24, replace = T) 
)
这将给出解决方案:

id     price      quantity
1      66.60838       84
但我真的希望能够使用更智能的解决方案,并将结果收集到一个数据帧中,因此如果我手动执行,它看起来有点像这样:

results <- cbind(id.1, id.2, etc..., id.24) 

results合并两个数据集,并使用
lappy
对每个id执行该功能

df3 <- merge(df,df2,all.x=TRUE,by="id")

diffvar <- function(df){ 
df4 <- subset(df3, id == df) 
df4[which.min(abs(df4$quantity-df4$eq.quantity)),]
}

resultslist <- lapply(levels(df3$id),function(df) diffvar(df))
df3data.tables很智能

将此添加到当前示例中

library(data.table)
dt = data.table(df)
dt2 = data.table(df2)
setkey(dt, id)
setkey(dt2, id)
dt[dt2, dif:=abs(quantity - eq.quantity)]
dt[,list(price=price[which.min(dif)], quantity=quantity[which.min(dif)]), by=id]
结果:

 dt[,list(price=price[which.min(dif)], quantity=quantity[which.min(dif)]), by=id]
    id      price quantity
 1:  1 66.6083758       84
 2:  2 29.2315840       19
 3:  3 62.3379442       63
 4:  4 54.4974836       31
 5:  5 66.6083758        6
 6:  6 69.3591292       13
...

你确定你的“解决方案”是对的吗?是的,我在设定种子之前做了一个数据集。。。。现在在帖子中对其进行了更改。谢谢,我希望您能尽快启发我:我不知道
subset(df3,id==df)
到底做了什么?或者我理解,但你不能在控制台中使用它?另外,您编写
function(df)diffvar(df))
而不是只编写
diffvar(df)
,这有什么作用?
library(plyr)
resultsdf <- ddply(df3, .(id), function(x)x[which.min(abs(x$quantity-x$eq.quantity)),])
library(data.table)
dt = data.table(df)
dt2 = data.table(df2)
setkey(dt, id)
setkey(dt2, id)
dt[dt2, dif:=abs(quantity - eq.quantity)]
dt[,list(price=price[which.min(dif)], quantity=quantity[which.min(dif)]), by=id]
 dt[,list(price=price[which.min(dif)], quantity=quantity[which.min(dif)]), by=id]
    id      price quantity
 1:  1 66.6083758       84
 2:  2 29.2315840       19
 3:  3 62.3379442       63
 4:  4 54.4974836       31
 5:  5 66.6083758        6
 6:  6 69.3591292       13
...