在R中将2个数据帧加在一起而不会丢失列

时间:2019-01-16 21:50:26

标签: r dataframe merge

我在R中有2个数据帧(df1,df2)。

A C D
1 1 1
2 2 2

df2 as

A B C
1 1 1
2 2 2

如何合并这两个数据帧以产生以下输出?

A B C D
2 1 2 1
4 2 4 2

对列进行排序并添加列值。两个DF的行数相同。先感谢您。 创建DF的代码:

df1 <- data.frame("A" = 1:2, "C" = 1:2, "D" = 1:2)
df2 <- data.frame("A" = 1:2, "B" = 1:2, "C" = 1:2)

5 个答案:

答案 0 :(得分:3)

 <target name="xml_latin_nl" depends="xml_latin_tree, geloofsverdediging_xml,geloofsverdediging_titels_xml">
   <xslt style="xml_latin_nl.xslt" in="xml_latin_tree/xml_latin_tree.xml" out="xml_latin_nl/xml_latin_nl.xml">
     <classpath location="${saxon-pe.location.ant}" />
   </xslt>
 </target>

答案 1 :(得分:2)

您可以尝试:

library(tidyverse)

list(df2, df1) %>%
  map(rownames_to_column) %>%
  bind_rows %>%
  group_by(rowname) %>%
  summarise_all(sum, na.rm = TRUE)

# A tibble: 2 x 5
  rowname     A     B     C     D
  <chr>   <int> <int> <int> <int>
1 1           2     1     2     1
2 2           4     2     4     2

答案 2 :(得分:0)

通过使用left_join()中的dplyr,您不会丢失该列

library(tidyverse)

dat1 <- tibble(a = 1:10,
               b = 1:10,
               c = 1:10)

dat2 <- tibble(c = 1:10,
               d = 1:10, 
               e = 1:10)

left_join(dat1, dat2, by = "c")
#> # A tibble: 10 x 5
#>        a     b     c     d     e
#>    <int> <int> <int> <int> <int>
#>  1     1     1     1     1     1
#>  2     2     2     2     2     2
#>  3     3     3     3     3     3
#>  4     4     4     4     4     4
#>  5     5     5     5     5     5
#>  6     6     6     6     6     6
#>  7     7     7     7     7     7
#>  8     8     8     8     8     8
#>  9     9     9     9     9     9
#> 10    10    10    10    10    10

reprex package(v0.2.1)于2019-01-16创建

答案 3 :(得分:0)

allnames <- sort(unique(c(names(df1), names(df2))))

df3 <- data.frame(matrix(0, nrow = nrow(df1), ncol = length(allnames)))
names(df3) <- allnames

df3[,allnames %in% names(df1)] <- df3[,allnames %in% names(df1)] + df1
df3[,allnames %in% names(df2)] <- df3[,allnames %in% names(df2)] + df2

df3
  A B C D
1 2 1 2 1
2 4 2 4 2

答案 4 :(得分:0)

这是一个Reduce的有趣的R方法。

Reduce(cbind,
       list(Reduce("+", list(df1[intersect(names(df1), names(df2))],
                             df2[intersect(names(df1), names(df2))])), # sum results
                             df1[setdiff(names(df1), names(df2))], # in df1, not df2
                             df2[setdiff(names(df2), names(df1))])) # in df2, not df1

这将返回

  A C D B
1 2 2 1 1
2 4 4 2 2

这假定df1和df2都具有彼此不存在的列。如果不正确,则必须调整列表。

还请注意,您可以在两个地方都将Reduce替换为do.call,并得到相同的结果。