给定一个向量中的一个准则和第二个向量中的一个值,在第三个向量中找到最接近的值,但在第四个向量中报告相应的值

问题描述 投票:0回答:1

我有两个数据框。

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”中的最接近值“一个”。例如,对于第一行,返回的答案将为1(“ aa”内与a = 0.1最接近的“ A”值是0.5,对应于bb = 1)。第二行的答案是20。

我已经看到了许多关于sapply和which.min的示例,但是我找不到能够解决此类问题的任何东西。有什么建议吗?

indexing match lookup sapply closest
1个回答
0
投票

我找到了解决方案

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
© www.soinside.com 2019 - 2024. All rights reserved.