我在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)
答案 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
,并得到相同的结果。