-1

我在一个列表中有多个文件,我想根据Year列合并它们,这样我的新文件看起来像Merged_file. 如果我有 2 个文件,我可以使用merge(file1, file2, by="Year"),但我不知道如何对列表中的多个文件执行此操作。我也试过这个newlist <- lapply(files, function(t)do.call(rbind.fill, t)),但这不是我想要的。

file1             file2                Merged_file

Year  Value1      Year  Value2         Year Value1 Value2
2001   1          2000   0.5           2001  1       0.3
2001   2          2000   0.6           2001  2       0.3 
2002   2          2001   0.3           2002  2       0.5
2002   3          2001   0.3           2002  3       0.6
2003   3          2002   0.5           2003  3       0.6       
2003   4          2002   0.6           2003  4       0.6
                  2003   0.6
                  2003   0.6
4

2 回答 2

1

你说每个数据集中的行数不一样;但是,任何一年的行数是否相同?我觉得您想获取同一年份的文件子集并将cbind它们组合(),但我不确定。看看这是否符合您的要求/意思:

file1 <- read.table(text=
"Year  Value1      
2001   1          
2001   2          
2002   2          
2002   3          
2003   3                
2003   4", header=TRUE)

file2 <- read.table(text=
"Year  Value2         
2000   0.5           
2000   0.6           
2001   0.3           
2001   0.3           
2002   0.5           
2002   0.6           
2003   0.6           
2003   0.6", header=TRUE)

bind.by.var <- function(file1, file2, var = intersect(names(file1), names(file2))) {
    do.call(rbind, lapply(intersect(file1[[var]], file2[[var]]), function(y) {
        cbind(file1[file1[[var]]==y,],
              file2[file2[[var]]==y,setdiff(names(file2),var),drop=FALSE])
    }))
}

该函数bind.by.var计算出两个文件共有的列(年份),然后计算出两个文件中出现的年份。然后,年复一年,将这些年结合(绑定)在一起。我不知道这是否是您想要的,但它确实符合您的Merged_file示例

> bind.by.var(file1, file2)
  Year Value1 Value2
1 2001      1    0.3
2 2001      2    0.3
3 2002      2    0.5
4 2002      3    0.6
5 2003      3    0.6
6 2003      4    0.6

鉴于此和文件列表,您可以Reduce在其上使用该技术。

Reduce(bind.by.var, list(file1, file2))

您将显式列表替换为从文件中读取的 data.frame 列表。

这里的假设是每个文件中任何一年都有相同数量的行。如果不是这种情况,您需要解释您希望如何组合/合并一年中的数据。

于 2013-04-12T18:00:15.753 回答
0

考虑使用带有命令“ldply”的“plyr”包。

### Create a vector of file names to be read in
files <- list.files()

### Iterate over each file, reading in data each time
data <- lapply(files, read.csv)

### Use "ldply" to merge files from a list into a data.frame
data <- ldply(data)
于 2013-04-12T16:43:53.713 回答