我正在寻找一个可扩展的方法来同时处理多个数据帧,条件是第一列匹配,同时还保持每个数据帧的列名不同。
在这个例子中只有三个数据帧,但是我使用了几百个,所以我试着编写可扩展的代码。
要提供上下文,正在从文件夹中读取数据文件,并且我有一个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
答案 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)