基于查找 df 中其他两列之间最接近的值返回值

2024-01-07

我的问题几乎相同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

按“site_no”分组后,我们slice“OBS”和“MOD”之间绝对差值最小的行

library(dplyr)
res <- df %>%
         group_by(site_no) %>% 
         slice(which.min(abs(OBS-MOD)))

注意:通过使用dplyr,一些额外的类,例如tbl_df tibble添加等应该与大多数其他功能一起使用。如果有任何问题,我们可以将其转换为 data.frameas.data.frame

str(res %>%
        as.data.frame)
#'data.frame':   3 obs. of  4 variables:
#$ site_no: Factor w/ 3 levels "01010500","02010500",..: 1 2 3
#$ OBS    : num  424 123 150
#$ MOD    : num  400 135 140
#$ HT     : num  12 19 10
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于查找 df 中其他两列之间最接近的值返回值 的相关文章

随机推荐