Изменять тибет R, ища значение в другом тибле - PullRequest
0 голосов
/ 31 декабря 2018

Обрабатывая данные в R, я бы хотел mutate тиббл так, чтобы числовые значения в новом столбце просматривались в другом тибле.

Учитывая набор данных удаления катетера:

# A tibble: 51 x 2
   ExplYear RemovalReason
      <dbl> <chr>        
 1     2018 Infection    
 2     2018 Dysfunction  
 3     2018 Infection    
# ... etc.

, где каждая строка соответствует отдельному удалению катетера, я хотел бы добавить столбец Implants, который содержит общее количество _im_plantations в год, когда катетер былудалено (_ex_planted).

Номера имплантации находятся в таблице impl_per_year:

# A tibble: 13 x 2
   ImplYear     n
      <dbl> <int>
 1     2006    14
 2     2007    46
 3     2008    64
# ... etc.

Я пытался mutate первый кусок с map и вспомогательная функция:

lookup = function(year) { impl_per_year[impl_per_year$ImplYear == year,]$n }
explants %>% mutate(Implants = map(ExplYear, lookup)

Но это помещает много пустых целочисленных векторов в столбец Implants:

# A tibble: 51 x 3
   ExplYear RemovalReason Implants
      <dbl> <chr>         <list>     
 1       18 Infection     <int [0]>  
 2       18 Dysfunction   <int [0]>  
 3       18 Infection     <int [0]>  
# ... etc.

В чем ошибка?

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

library(tidyverse)

Я изменил ваши данные, чтобы на моей иллюстрации не было вывода NULL.

df <- tribble(
~ExplYear, ~RemovalReason,
2018, "Infection",   
2017, "Dysfunction",
2016, "Infection")

impl_per_year <- tribble(
  ~ImplYear, ~n,
  2017, 14,
  2016, 46,
  2016, 64
)

left_join - это функция, которую вы ищете,Это часть семейства функций dplyr::join, которые делают это.

Хорошо иметь одинаковые имена для «объединения» переменных, но в вашем случае вам нужна опция by = c( ... ), чтобы left_join знал, к чему вы присоединяетесь.

left_join(df, impl_per_year, by = c("ExplYear" = "ImplYear"))

# A tibble: 4 x 3
  ExplYear RemovalReason     n
     <dbl> <chr>         <dbl>
1     2018 Infection        NA
2     2017 Dysfunction      14
3     2016 Infection        46
4     2016 Infection        64

В зависимости от того, что вы хотите, учитывайте right_join, inner_join и т. Д., Пока не получите результат, который ищете.Например:

inner_join(df, impl_per_year, by = c("ExplYear" = "ImplYear"))

# A tibble: 3 x 3
  ExplYear RemovalReason     n
     <dbl> <chr>         <dbl>
1     2017 Dysfunction      14
2     2016 Infection        46
3     2016 Infection        64

..., который дает только успешные совпадения из обоих выпусков.

0 голосов
/ 31 декабря 2018

Вы должны быть в состоянии просто объединить две таблицы по годам.Если мы назовем ваш первый столбик ExplTibble и ваш второй ImplTibble, используя dplyr:

ExplTibble %>% left_join(ImplTibble, by = c("ExplYear" = "ImplYear"))

Это должно добавить новый столбец n, содержащий количество имплантатов в каждом году.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...