我的问题几乎相同this one https://stackoverflow.com/questions/41496276/return-rows-establishing-a-closest-value-to-in-r除非不是寻找列值和固定数字之间最接近的值,例如“2”,我想找到最接近的值另一栏。。
这是一个数据示例:
df <- data.frame(site_no=c("01010500", "01010500", "01010500","02010500", "02010500", "02010500", "03010500", "03010500", "03010500"),
OBS=c(423.9969, 423.9969, 423.9969, 123, 123, 123, 150,150,150),
MOD=c(380,400,360,150,155,135,170,180,140),
HT=c(14,12,15,3,8,19,12,23,10))
看起来像这样:
site_no OBS MOD HT
1 01010500 423.9969 380 14
2 01010500 423.9969 400 12
3 01010500 423.9969 360 15
4 02010500 123.0000 150 3
5 02010500 123.0000 155 8
6 02010500 123.0000 135 19
7 03010500 150.0000 170 12
8 03010500 150.0000 180 23
9 03010500 150.0000 140 10
目标是,对于每个“site_no”,找到与OBS值最接近的MOD值,然后返回对应的HT。例如,对于 site_no 01010500,423.9969 - 400 产生最小差异,因此该函数将返回 12。我已经尝试了其他帖子中的大部分解决方案,但由于 $ 与原子向量而出现错误(df 是递归的) ,但我认为该功能不是)。我试过:
ddply(df, .(site_no), function(z) {
z[abs(z$OBS - z$MOD) == min(abs(z$OBS - z$MOD)), ]
})
Error in z$River_Width..m. - z$chan_width :
non-numeric argument to binary operator