Если column2 - это NA, присоединиться к column1, иначе присоединиться к column1 и column2 - PullRequest
0 голосов
/ 10 октября 2018

Я уверен, что этот вопрос задавался ранее, но я не могу найти ответ на мою жизнь.Я хочу использовать dplyr, чтобы объединить два элемента.Если второй столбец NA, просто присоединитесь к первому столбцу.Если второй столбец не является NA, объедините первый и второй столбцы.Решение ниже не работает, но это то, что я пытаюсь сделать.

library(tidyverse)
df1 <- tibble(x = c("Name", "City", "City"),  y = c("Table5", "Table1", "Table2"))
df2 <- tibble(x2 = c("Name", "City", "City"), y2 = c(NA, "Table1", "Table2"), z = c("a", "b", "c"))

joined_data <- if (is.na(df2$y2)) {
  df1 %>% 
    left_join(df2, by = c("x" = "x2"))
} else {
  df1 %>% 
    left_join(df2, by = c("x" = "x2", "y" = "y2")) 
}

Окончательный результат должен быть

  x     y      z    
  <chr> <chr>  <chr>
1 Name  Table5 a  
2 City  Table1 b    
3 City  Table2 c 

1 Ответ

0 голосов
/ 10 октября 2018

Сначала мы находим все индексы NA, а затем объединяем их в два отдельных вызова.Для индексов не-NA мы присоединяем их к x и y, тогда как для индексов NA мы присоединяем их только к x и выбираем значение не-NA между y и y2, используя coalesce, а затем связываемстроки вместе.

library(tidyverse)
NAinds <- is.na(df2$y2)

df1[!NAinds,] %>%
   left_join(df2, by = c("x" = "x2", "y" = "y2")) %>%
   bind_rows(df1[NAinds, ]  %>%
                 left_join(df2,  by = c("x" = "x2")) %>%
                 mutate(y = coalesce(y, y2)) %>%
                 select(-y2))


#   x     y      z    
# <chr> <chr>  <chr>
#1 City  Table1 b    
#2 City  Table2 c    
#3 Name  Table5 a  
...