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
...