我有两个数据框。
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的示例,但是我找不到能够解决此类问题的任何东西。有什么建议吗?
我找到了解决方案
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