首页 > 解决方案 > 将两个不同大小的 tbls 按一个因素连接起来,并将某个值的位置放在另一个中

问题描述

我正在尝试在 R 中加入两个不同大小的 tbl,但在以下点上有点卡住:

Tbl1:
A tibble: 27 x 2
             Value1 Factor
              <dbl> <fct>           
 1             0.39 10Y             
 2             0.39 10Y             
 3             0.17 10Y             
 4             0.17 10Y             
 5             0.11 10Y             
 6             0.11 10Y             
 7             0.03 10Y             
 8             0.03 15Y             
 9            11.9  15Y             
10            11.9  15Y             

Tbl2:
A tibble: 20 x 3
   Factor  Value2    Value3
   <fct>   <dbl>      <dbl>
 1 10Y    0            0.09
 2 10Y    0            1.01
 3 10Y    0.00500      5.01
 4 10Y    0.014        10.0 
 5 15Y    0            0.17
 6 15Y    0.001000     1.51
 7 15Y    0.012        6.01
 8 15Y    0.029        15.0 
 9 20Y    0            0.25
10 20Y    0.002        2.01

我想要做的是首先通过因子匹配它们,即“10Y”“15Y”等,然后在 Tbl2Value3 中选择最接近 Tbl1Value1 的值,并将 tbl2 中的某个 Value2 添加到 Tbl1 中的新列。

到目前为止,我尝试的是计算 tbl2 中这些值的索引。还尝试了 intersect() 来查找相交因子。

indices <- array()
for (i in 1:nrow(tbl1)){
  indices[i] <- which(abs(tbl2$Value3 - tbls1$Value1[i])==min(abs(tbls2$Value3 - tbl1$Value1[i])))
}

有没有比 which() 更好的方法来找到这些值的位置?鉴于上述所有条件,我如何才能真正将两者结合在一起?

真的很期待你的想法!

非常感谢

PS:如果我的代码伤害了任何人的感受,我深表歉意......我只是在学习。谢谢

标签: rjoindplyr

解决方案


或者,这可以使用滚动连接来解决,data.table其中参数roll = "nearest"请求为最后一个连接条件找到最接近的值Value3 = Value1

library(data.table)
library(magrittr)
    
result <- 
  setDT(Tbl2)[setDT(Tbl1), on = .(Factor, Value3 = Value1), roll = "nearest"] %>% 
  setnames("Value3", "Value1") %>% # clean up
  setcolorder(c("Value1", "Factor"))
result
    Value1 Factor Value2
 1:   0.39    10Y  0.000
 2:   0.39    10Y  0.000
 3:   0.17    10Y  0.000
 4:   0.17    10Y  0.000
 5:   0.11    10Y  0.000
 6:   0.11    10Y  0.000
 7:   0.03    10Y  0.000
 8:   0.03    15Y  0.000
 9:  11.90    15Y  0.029
10:  11.90    15Y  0.029

数据

library(data.table)

Tbl1 <- fread("
rn           Value1 Factor
 1             0.39 10Y             
 2             0.39 10Y             
 3             0.17 10Y             
 4             0.17 10Y             
 5             0.11 10Y             
 6             0.11 10Y             
 7             0.03 10Y             
 8             0.03 15Y             
 9            11.9  15Y             
10            11.9  15Y", drop = 1L)

Tbl2 <- fread("
rn Factor  Value2    Value3
 1 10Y    0            0.09
 2 10Y    0            1.01
 3 10Y    0.00500      5.01
 4 10Y    0.014        10.0 
 5 15Y    0            0.17
 6 15Y    0.001000     1.51
 7 15Y    0.012        6.01
 8 15Y    0.029        15.0 
 9 20Y    0            0.25
10 20Y    0.002        2.01", drop = 1L)

推荐阅读