Как объединить / уплотнить две таблицы, содержащие случайные значения NA

#r #dataframe #dplyr #merge

#r #фрейм данных #dplyr #объединить

Вопрос:

У меня есть два фрейма данных:

 
df1 =  data.frame(Experiment = "exp",
                  Variable = ".13",
                  Genename = "ENSG00003",
                  Index = 1,
                  Score1 = NA,
                  Score2 = 1,
                  Score3 = 1:2
                  )

df2 =  data.frame(Experiment = "exp",
                  Variable = ".13",
                  Genename = "ENSG00003",
                  Index = NA,
                  Score1 = 1,
                  Score2 = NA,
                  Score3 = 1:2
                  )

  

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

Я пытался:

 merge(x = df1, y = df2, by.x = names(df1), by.y = names(df2), all.x = TRUE, all.y = TRUE)

merge(x = df1, y = df2, by.x = c("Experiment", "Variable", "Index", "Genename"), by.y = c("Experiment", "Variable", "Index", "Genename"), all.x = TRUE, all.y = TRUE)

aggregate(. ~ Genename, data = merge(df1, df2, all= TRUE), na.action = na.pass, FUN = sum, na.rm = TRUE)

dplyr::full_join(x = df1, y = df2, by = c("Experiment", "Variable", "Genename"))

data %>% mutate(mycol = coalesce(x,y,z)) %>% select(a, mycol)

coalesce(df1, df2)

  

И, кроме того, поиграл с различными аргументами для приведенного выше, опущенными здесь для краткости. Кажется, я просто не могу найти простой способ сделать то, что мне нужно. Я просто хочу объединить два фрейма данных неразрушающим образом и исключить значения NA из этого предложения ‘неразрушающий’.

Комментарии:

1. Что не так с coalesce(df1, df2) или coalesce(df2, df1) ? Они выглядели для меня просто отлично. Каков ваш ожидаемый результат?

2. Мне нужно объединение, чтобы иметь возможность обрабатывать неожиданные столбцы в df2, и я обеспокоен тем, что объединение по столбцам может привести к тому, что столбцы не будут синхронизированы друг с другом.

Ответ №1:

Сначала выполните полное объединение, а затем используйте coalesce() внутри mutate() . Обратите внимание, что в вашем примере столбцы объединения не уникальны и, следовательно, в выходных данных каждая строка дублируется. Вам все равно придется очистить эти дубликаты.

 library(dplyr)

df1 %>% 
  full_join(df2, by = c("Experiment", "Variable", "Genename")) %>% 
  mutate(
    Index = coalesce(Index.x, Index.y),
    Score1 = coalesce(Score1.x, Score1.y),
    Score2 = coalesce(Score2.x, Score2.y),
    Score3 = coalesce(Score3.x, Score3.y),
  ) %>% 
  select(-ends_with(".x"), -ends_with(".y"))
  

Комментарии:

1. Прошу прощения, я забыл упомянуть, что мне нужно сделать это как единый фрейм данных, потому что мне нужно объединение, чтобы иметь возможность обрабатывать неожиданные столбцы в df2, и я обеспокоен тем, что объединение по столбцам может привести к тому, что столбцы не будут синхронизированы друг с другом.