合并两个数据框,相似的行,相似的列(一个列除外)具有不同的值

时间:2020-02-04 00:53:31

标签: r

我有两个数据框要合并为一个。一个数据帧中的行并不总是位于另一数据帧中,反之亦然。我想保留两个数据集中的所有行和列。另外,有一列(“标签”)有时对于同一条感兴趣的行(“ ID”)具有不同的值。我的数据集太大,无法手动找到它们。当“标记”中的值不相同时,我很难创建单独的列。我已经尝试过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 个答案:

答案 0 :(得分:2)

联合或行联接将给您十行,我认为这不是您所需要的。它还不会分隔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

答案 1 :(得分:0)

或者使用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))