我有多个 Dataframe ,列号不同,有数千行。每个DF都有年份和ISO列。我想将所有这些合并到一个最终的DF中,它有一个单独的Year和ISO列,以及与原始DF中的列相对应的唯一值列。最后的输出必须以.xlsx返回,所以我想最大限度地减少主要由NA填充的行数。
下面是一个可重复的示例:
library(ISOcodes)
df1 = data.frame(Year = sample(2000:2020, 10),
ISO = sample(ISO_3166_1$Alpha_2, 10),
value1 = sample(1:100, 10))
df2 = data.frame(Year = sample(2000:2020, 10),
ISO = sample(ISO_3166_1$Alpha_2, 10),
value2 = sample(1:100, 10))
df3 = data.frame(Year = sample(2000:2020, 10),
ISO = sample(ISO_3166_1$Alpha_2, 10),
value3 = sample(1:100, 10))
df4 = data.frame(Year = sample(2000:2020, 10),
ISO = sample(ISO_3166_1$Alpha_2, 10),
value4 = sample(1:100, 10))
df5 = data.frame(Year = sample(2000:2020, 10),
ISO = sample(ISO_3166_1$Alpha_2, 10),
value5 = sample(1:100, 10))
full_df = merge(df1, df2, by = c('Year', 'ISO'), all = T)
full_df = merge(full_df, df3, by = c('Year', 'ISO'), all = T)
full_df = merge(full_df, df4, by = c('Year', 'ISO'), all = T)
full_df = merge(full_df, df5, by = c('Year', 'ISO'), all = T)
我必须指定all = T
,这样我就不会丢失数据。这个解决方案感觉非常笨拙,我相信一定有更优雅的方法来实现它(可能使用data.table
?).
谢谢!
3条答案
按热度按时间hwamh0ep1#
编辑:注意-你可以通过强制df 5与df 4具有相同的年份和ISO值来测试
NA
的最小化。然后,您会期望最终输出的dim()
为~ 40 x7,而不是50 x7(取决于样本)。嵌套的
dplyr::full_join()
将最小化NA
Not minimizing
NA
-dplyr::bind_rows()
“按行高效绑定多个 Dataframe ”。笨重,但将最小化
NA
-data.table::merge()
的方法“快速合并两个数据。表”。quhf5bfb2#
这是否有效:
tjvv9vkg3#