Соедините две таблицы разного размера по коэффициентам в одном и положением определенного значения в другом - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь соединить две таблицы разного размера в R, но немного застрял в следующей точке:

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 и добавить определенное значение Value2 из tbl2 в новый столбец в 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])))
}

Есть ли лучший способ найти положение этих значений, чем которое ()? И как я могу на самом деле соединить два вместе, учитывая все вышеперечисленные условия?

Очень жду ваших идей!

Большое спасибо

П.С .: Я прошу прощения, если мой код причиняет кому-то вред ... Я только учусь. Спасибо

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

В качестве альтернативы, это можно решить с помощью скользящего соединения с 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)
0 голосов
/ 13 мая 2019

Этот ответ использует inner_join, а затем получает top_n для каждой группы.top_n взвешивается по абсолютным значениям разности Value3 и Value1.

Редактировать: Кроме того, я импортировал Factor как символ.Это облегчает объединение, так как inner_join не нужно будет приводить фактор к персонажу.

library(dplyr)

#add id to tb1
tbl1 <- mutate(tbl1, id = row_number())

inner_join(tbl1, tbl2, by = 'Factor')%>%
  group_by(Factor, id)%>%
  top_n(1, wt = desc(abs(Value3 - Value1)))%>%
  ungroup()

# A tibble: 10 x 5
   Value1 Factor    id Value2 Value3
    <dbl> <chr>  <int>  <dbl>  <dbl>
 1   0.39 10Y        1  0       0.09
 2   0.39 10Y        2  0       0.09
 3   0.17 10Y        3  0       0.09
 4   0.17 10Y        4  0       0.09
 5   0.11 10Y        5  0       0.09
 6   0.11 10Y        6  0       0.09
 7   0.03 10Y        7  0       0.09
 8   0.03 15Y        8  0       0.17
 9  11.9  15Y        9  0.029  15   
10  11.9  15Y       10  0.029  15

И данные:

tbl1 <- read.table(textConnection(             
'             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  '  ), stringsAsFactors = FALSE)

tbl2 <- read.table(textConnection(
'   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
'), stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...