【问题标题】:Merging two dataframes using closest lower value in R使用 R 中最接近的较低值合并两个数据帧
【发布时间】:2021-04-11 20:17:15
【问题描述】:

我从以下两个数据框中提取了部分信息:

df1 <- data.frame(sample=c(1, 2, 3, 4, 5),
                       RT=c(3.88, 4.52, 32.82, 15.71, 20.33),
                       Hit=c(2, 1, 7, 1, 5))

df2 <- data.frame(rt_stand=c(4.5, 8.5, 15.8, 23.2, 35.0),
                       n_carb=c(10, 11, 12, 13, 14),
                       below=c(5.5, 6.8, 8.2, 10.0, 12.3))

我希望 df2 中的行根据 最近但较低的值加入 df1 的行。

输出将是这样的数据框:

sample RT Hit rt_stand n_carb below
1 3.88 2 NA NA NA
2 4.52 1 4.5 10 5.5
3 32.82 7 23.2 13 10.0
4 15.71 1 8.5 11 6.8
5 20.33 5 15.8 12 8.2

上面是一个可重复的小例子。我相信要处理整个数据集,我需要创建一个循环,根据一个找到最小但更小的数字的函数将 df2 行绑定/合并到 df1。

我们将不胜感激。

【问题讨论】:

  • 哪个变量的值最近但较低?您是否将df1RTdf2rt_stand 进行比较?
  • 滚动连接?我不太清楚您期望的逻辑:library(data.table); setDT(df1); setDT(df2); df2[df1, on="rt_stand==RT", roll=TRUE]

标签: r loops merge


【解决方案1】:

您可以使用fuzzyjoin 包来保留RT 大于rt_stand 的行,并为每个sample 保留最接近的值。

library(dplyr)

fuzzyjoin::fuzzy_inner_join(df1, df2, by = c('RT' = 'rt_stand'), 
                            match_fun = `>`) %>%
  arrange(sample, rt_stand) %>%
  group_by(sample) %>%
  slice(n()) %>% 
  ungroup -> result

result
# A tibble: 4 x 6
#  sample    RT   Hit rt_stand n_carb below
#   <dbl> <dbl> <dbl>    <dbl>  <dbl> <dbl>
#1      2  4.52     1      4.5     10   5.5
#2      3 32.8      7     23.2     13  10  
#3      4 15.7      1      8.5     11   6.8
#4      5 20.3      5     15.8     12   8.2

请注意,上述result 没有sample = 1,因为没有大于rt_standsampleRT 值。要获取所有 sample 值,您可以这样做:

df1 %>%
  filter(!sample %in% result$sample) %>%
  bind_rows(result)

#  sample    RT Hit rt_stand n_carb below
#1      1  3.88   2       NA     NA    NA
#2      2  4.52   1      4.5     10   5.5
#3      3 32.82   7     23.2     13  10.0
#4      4 15.71   1      8.5     11   6.8
#5      5 20.33   5     15.8     12   8.2

【讨论】:

  • 非常感谢。这很好用,fuzzyjoin 非常有帮助!
猜你喜欢
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 2014-04-14
  • 2016-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多