Объединение двух информационных фреймов, одинаковых строк и одинаковых столбцов, за исключением одного столбца, имеет разные значения - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть два кадра данных, которые я хочу объединить в один. Строки в одном кадре данных не всегда находятся в другом, и наоборот. Я хочу сохранить все строки и столбцы из обоих наборов данных. Кроме того, существует один столбец («Тег»), который иногда имеет разные значения для одной и той же интересующей строки («Идентификатор»). Мой набор данных слишком большой, чтобы найти их вручную. У меня возникают трудности при создании отдельного столбца для случаев, когда значения в «Tag» не идентичны. Я пробовал test.output1 <-union(test.df1, test.df2,suffix=c(".1",".2")), но получаю ошибку из-за того, что некоторые идентичные столбцы имеют разные уровни факторов. Я также пробовал варианты: test.output2<-rbind.fill(test.df1, test.df2), но в итоге получаю дублирующиеся строки.

Любая помощь очень ценится. Спасибо!

Пример:

#dataframe 1
test.df1
ID     Year   Location Tag    Length
H1     2013   Site1    272   46
H2     2013   Site2    236   984
H3     2014   Site3    150   68
H4     2014   Site4    698   12
H34    2015   Site1    594   65

#dataframe 3
test.df2
ID     Year   Species Tag    
H1     2013   1       631 
H2     2013   2       236
H3     2014   3       755
H4     2014   4       698
H12    2017   3       135

#What I would like the output to be
test.df.3 
ID     Year   Location  Species Tag.1   Tag.2  Length
H1     2013   Site1     1       272     631    46
H2     2013   Site2     2       236     NA     984
H3     2014   Site3     3       150     755    68
H4     2014   Site4     4       698     NA     12
H12    2017   NA        3       NA      135    NA
H34    2015   Site1     NA      594     NA     65

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Объединение или объединение строк даст вам десять рядов, я не думаю, что это то, что вам нужно. Он также не разделяет столбцы Tag.

Я думаю, вам нужна операция merge или объединение.

merge(test.df1, test.df2, by = c("ID", "Year"), all=TRUE)
#    ID Year Location Tag.x Length Species Tag.y
# 1  H1 2013    Site1   272     46       1   631
# 2 H12 2017     <NA>    NA     NA       3   135
# 3  H2 2013    Site2   236    984       2   236
# 4  H3 2014    Site3   150     68       3   755
# 5 H34 2015    Site1   594     65      NA    NA
# 6  H4 2014    Site4   698     12       4   698

Это отличается от того, что вы перечислили в своем вопросе, но я думаю, что предпосылка правильная.

Редактировать . Ближе к вашему вопросу, здесь мы обновляем Tag.y до NA, где оно соответствует Tag.x.

out <- merge(test.df1, test.df2, by = c("ID", "Year"), all=TRUE)
out <- within(out, { Tag.y[Tag.x == Tag.y] = NA_integer_ })
out
#    ID Year Location Tag.x Length Species Tag.y
# 1  H1 2013    Site1   272     46       1   631
# 2 H12 2017     <NA>    NA     NA       3   135
# 3  H2 2013    Site2   236    984       2    NA
# 4  H3 2014    Site3   150     68       3   755
# 5 H34 2015    Site1   594     65      NA    NA
# 6  H4 2014    Site4   698     12       4    NA
0 голосов
/ 04 февраля 2020

В качестве альтернативы можно использовать dplyr и удалить дубликаты, поэтому, если tag.x == tag.y, оставьте только tag.x

library(dplyr)    
test.df3 <- full_join(test.df1, test.df2, by = c("ID", "Year")) %>%
  mutate(tag.y = if_else(tag.x == tag.y, NA_integer_, tag.y))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...