R условное соединение - PullRequest
0 голосов
/ 05 июля 2018

есть ли способ присоединиться и обновить столбец в R? Пример:

tbl1 <- tibble(ID = LETTERS[1:3],
       VAL = rep(NA, 3),
       tbl1_df = list(tibble(A = rnorm(3),
                             B = rnorm(3))))

tbl2 <- tibble(ID = LETTERS[1:3],
               VAL = c(1, 2, 3),
               tbl2_df = list(tibble(A = rnorm(3),
                                     B = rnorm(3))))

tbl3 <- tibble(ID = LETTERS[1:3],
               VAL = c(1, 2, 3),
               tbl3_df = list(tibble(A = rnorm(3),
                                     B = rnorm(3))))

Я хочу объединить эти тиблы и обновить VAL с помощью одной из таблиц, имеющих значения. Таблицы всегда будут иметь одинаковые значения в VAL, но я не всегда знаю, в какой таблице они находятся. Нужно ли объединять столбцы VAL или хранить столбец VAL в одном из столбцов, где существуют значения?

Ответ должен выглядеть следующим образом, и, как уже упоминалось, не имеет значения, из какого столбца таблицы VAL происходит, таблицы имеют идентичные VAL или NA.

tibble(ID = LETTERS[1:3],
                 VAL = c(1, 2, 3),
                 tbl1_df = list(tibble(A = rnorm(3),
                                       B = rnorm(3))),
                 tbl2_df = list(tibble(A = rnorm(3),
                                       B = rnorm(3))),
                 tbl3_df = list(tibble(A = rnorm(3),
                                       B = rnorm(3))))

# A tibble: 3 x 5
  ID      VAL tbl1_df          tbl2_df          tbl3_df         
  <chr> <dbl> <list>           <list>           <list>          
1 A        1. <tibble [3 x 2]> <tibble [3 x 2]> <tibble [3 x 2]>
2 B        2. <tibble [3 x 2]> <tibble [3 x 2]> <tibble [3 x 2]>
3 C        3. <tibble [3 x 2]> <tibble [3 x 2]> <tibble [3 x 2]>

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Основываясь на комментариях от Jaap, вы можете объединить тиблы в один тиббл, используя команду уменьшения из purrr с full_join из dplyr. Вопрос в том, как просто получить VAL, который существует, вместо того, чтобы иметь 3 столбца для VAL, не все из которых имеют данные. Простой способ сделать это - использовать команду coalesce из dplyr, которая принимает первое не пропущенное значение. Проблема, представленная на этом шаге, состоит в том, что типы данных являются БУЛЕВЫМИ, если они все являются NA, поэтому это решается с помощью as.numeric. Наконец, дополнительные столбцы VAL, к которым добавляется буква после, удаляются.

library(dplyr)
library(purrr)

reduce(list(tbl1, tbl2, tbl3), full_join, by = "ID") %>% # Combine the tibbles into a single tibble
  mutate(VAL= coalesce(as.numeric(VAL.x), as.numeric(VAL.y), as.numeric(VAL))) %>% # Create a variable for VAL which takes the first non missing using the coalesce function
  select(-starts_with("Val.")) # Delete the columns for VAL which were created when joining and have a name of VAL. and then a letter
0 голосов
/ 05 июля 2018

Как насчет этого?

library(purrr)

list(tbl1, tbl2, tbl3) %>% 
  reduce(full_join, by = "ID") %>%   #merge all tables
  select_if(~!all(is.na(.))) %>%     #drop columns having all NA value
  select(-starts_with("VAL."))       #keep only one 'VAL' column and drop remaining repetitive columns

, что дает

# A tibble: 3 x 5
  ID    tbl1_df          tbl2_df            VAL tbl3_df         
  <chr> <list>           <list>           <dbl> <list>          
1 A     <tibble [3 x 2]> <tibble [3 x 2]>  1.00 <tibble [3 x 2]>
2 B     <tibble [3 x 2]> <tibble [3 x 2]>  2.00 <tibble [3 x 2]>
3 C     <tibble [3 x 2]> <tibble [3 x 2]>  3.00 <tibble [3 x 2]>
...