首页 > 解决方案 > 给定一个向量中的标准和第二个向量中的值,在第三个向量中找到最接近的值,但在第四个向量中报告相应的值

问题描述

我有两个数据框。

dfx <- data.frame(ID=c("A", "A", "A", "B", "B", "B", "B", "B", "B"), 
                 a=c( 0.1, 2.1, 1.5, 1.8, 8, 1, 1.4, 39, 100))

  ID     a
1  A   0.1
2  A   2.1
3  A   1.5
4  B   1.8
5  B   8.0
6  B   1.0
7  B   1.4
8  B  39.0
9  B 100.0

dfy<-data.frame(ID=c("A", "A", "A", "B", "B", "C", "C", "D"),
                aa=c(0.5, 1, 2, 5, 10, 20, 40, 80),
                bb=c(1, -1, 20, -5, 10, 20, 40, 80))

  ID   aa bb
1  A  0.5  1
2  A  1.0 -1
3  A  2.0 20
4  B  5.0 -5
5  B 10.0 10
6  C 20.0 20
7  C 40.0 40
8  D 80.0 80



我正在寻找一种在 dfx 中创建新变量的方法,使用每行中的 ID 和“a”中的值来查找特定于 ID 的“bb”,使用“aa”中相对于“a”的最接近的值”。例如,对于第一行,返回的答案将为 1(“aa”中最接近 a = 0.1 的“A”值为 0.5,对应于 bb = 1)。第二行的答案是 20。

我看过很多关于 sapply 和 which.min 的例子,但是我找不到任何可以帮助我解决这类问题的东西。有什么建议吗?

标签: indexingmatchlookupsapplyclosest

解决方案


我找到了解决方案

library(data.table)

dtx<-as.data.table(dfx)
dty<-as.data.table(dfy)
setkeyv(dtx,c("ID","a"))
setkeyv(dty,c("ID","aa"))
dtx$ID<-as.character(dtx$ID)
dtx$a<-as.double(dtx$a)
dty$ID<-as.character(dty$ID)
dty$aa<-as.double(dty$aa)
newtable<-dty[dtx,on=c(ID="ID",aa="a"),roll="nearest"]
names(newtable)[names(newtable)=="aa"]<-"a"

  ID     a bb
1:  A   0.1  1
2:  A   1.5 -1
3:  A   2.1 20
4:  B   1.0 -5
5:  B   1.4 -5
6:  B   1.8 -5
7:  B   8.0 10
8:  B  39.0 10
9:  B 100.0 10

推荐阅读