Left_join заполнить записи NA значениями данных из второго кадра данных - PullRequest
1 голос
/ 06 марта 2020

У меня есть два довольно сложных data.frames, и мне удалось упростить первый шаг моей проблемы здесь. У меня есть справочная таблица и другая, которая содержит мои данные следующим образом:

ССЫЛКА

ref <- structure(list(group = c("A", "B", "C"), position = c("a", "a", 
"b")), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"))

ДАННЫЕ

df <- structure(list(position = c("a", "a"), value = c(1, 1, 2), name = c("foo", 
"bar")), row.names = c(NA, -2L), class = c("tbl_df", "tbl", "data.frame"))

Я использовал left_join(ref,df,by="position") %>% arrange(name) для получения:

1 A     a            1 foo  
2 A     a            1 bar  
3 B     a            1 foo  
4 B     a            1 bar  
5 C     b           NA NA

Однако идеальный вывод:

  group position value name 
  <chr> <chr>    <dbl> <chr>
1 A     a            1 bar  
2 B     a            1 bar  
3 C     b            0 bar
4 A     a            1 foo  
5 B     a            1 foo  
6 C     b            0 foo

Я бы хотел имя столбца для замены NA на вход от df и значение NA столбца на 0. В реальном df у меня больше, чем foo в столбце имени

1 Ответ

2 голосов
/ 06 марта 2020

Мы могли бы использовать crossing для получения комбинаций, затем replace значения столбца 'value' в 0, где столбцы 'position' не равны

library(dplyr)
library(tidyr)
crossing(ref, df %>% 
                rename(position2 = position)) %>%
    arrange(name) %>%
    mutate(value = replace(value, position != position2 , 0)) %>% 
    select(-position2)
# A tibble: 6 x 4
#  group position value name 
#  <chr> <chr>    <dbl> <chr>
#1 A     a            1 bar  
#2 B     a            1 bar  
#3 C     b            0 bar  
#4 A     a            1 foo  
#5 B     a            1 foo  
#6 C     b            0 foo  
...