如何合并多个数据框并在R中维护不同的列名?

时间:2018-02-12 11:23:16

标签: r dataframe merge match

我正在寻找一个可扩展的方法来同时处理多个数据帧,条件是第一列匹配,同时还保持每个数据帧的列名不同。

在这个例子中只有三个数据帧,但是我使用了几百个,所以我试着编写可扩展的代码。

要提供上下文,正在从文件夹中读取数据文件,并且我有一个for循环来遍历文件。

files <- list.files(path = "Documents/")

df <- list()

for (i in 1:length(files)) {

   df[[i]] <- read.csv(paste0("Documents/",files[i]))

   # code to perform action goes here

}

以下是样本输入和预期输出 -

这是df [[1]]

date    blue
1/1/11  5
1/1/12  6
2/1/13  2

此ID df [[2]]

date    orange
1/1/11  2
1/1/12  5
2/1/13  2

这是df [[3]]

date    red
1/1/11  4
2/1/13  2

这是预期的输出:

date    blue    orange  red
1/1/11  5       2       4
1/1/12  6       5       NA
2/1/13  2       2       2

3 个答案:

答案 0 :(得分:1)

答案由Matthew Plourde在Merging a lot of data.frames

中提供
Reduce(function(x, y) merge(x, y, all=TRUE), list(df1, df2, df3))

答案 1 :(得分:0)

您可以使用dplyr

df1 <- read.table(header=TRUE, text="date    blue
1/1/11  5
1/1/12  6
2/1/13  2")

df2 <- read.table(header=TRUE, text="date    orange
1/1/11  2
1/1/12  5
2/1/13  2")

df3 <- read.table(header=TRUE, text="date    red
1/1/11  4
2/1/13  2")

library(dplyr)
df4 <- full_join(inner_join(df1, df2), df3)

df4
#     date blue orange red
# 1 1/1/11    5      2   4
# 2 1/1/12    6      5  NA
# 3 2/1/13    2      2   2

答案 2 :(得分:-1)

另一种方法是使用Reduce()base::merge()

# data sample organized to a list
df1 <- data.frame(date = c("1/1/11", "1/1/12", "2/1/13"), blue = c(5, 6, 2))
df2 <- data.frame(date = c("1/1/11", "1/1/12", "2/1/13"), orange = c(2, 5, 2))
df3 <- data.frame(date = c("1/1/11", "2/1/13"), red = c(4, 2))
df_list <- list(df1, df2, df3)

# solution
merged_df <- Reduce(f = merge, x = df_list)