#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, и я обеспокоен тем, что объединение по столбцам может привести к тому, что столбцы не будут синхронизированы друг с другом.