我有一个数据帧列表(df1)和另一个数据帧列表(df2),它们包含在第一个列表中查找“最近值”所需的值。
df1<-list(d1=data.frame(y=1:10), d2=data.frame(y=3:20))
df2<-list(d3=data.frame(y=2),d4=data.frame(y=4))
说我有这个功能:
df1[[1]]$y[which(abs(df1[[1]]$y-df2[[1]])== min(abs(df1[[1]]$y-df2[[1]])))]
此函数在df1中找到df2值1的最接近值时非常有效。我无法实现的是与lapply一起工作,如:
lapply(df1, function(x){
f<-x$y[which(abs(x$y-df2) == min(abs(x$y - df2)))]
})
我想返回一个数据框,其中包含所有f值,显示df1中每个项目的最接近数字。
谢谢, 中号
答案 0 :(得分:1)
我假设您正在尝试将df1和df2中的第一个data.frames
相互比较,并将df1和df2中的第二个data.frames
相互比较。使用which.min
函数也很有用(请查看help(which.min))
。
修改强>
在回复您的评论时,您可以改为使用mapply
:
> mapply(function(x,z) x$y[which.min(abs(x$y - z$y))], df1, df2)
d1 d2
2 4
答案 1 :(得分:1)
OP的真正问题尚不清楚,但我可能会这样做......
library(data.table)
DT1 = rbindlist(unname(df1), idcol=TRUE)
DT2 = rbindlist(unname(df2), idcol=TRUE)
DT1[DT2, on=c(".id","y"), roll="nearest"]
# .id y
# 1: 1 2
# 2: 2 4