【问题标题】:Merge multiple files in a list with different number of rows [duplicate]合并具有不同行数的列表中的多个文件[重复]
【发布时间】:2013-04-12 15:35:06
【问题描述】:

我在一个列表中有多个文件,我想根据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

【问题讨论】:

  • 我使用了这个merged.data.frame = Reduce(function(...) merge(..., all=T), list.of.data.frames),但它似乎不适用于具有不同行数的数据帧
  • 仔细观察,您所说的“合并”似乎没有很好的定义。例如,结果中只有两行 2002。每个文件中每年是否总是只有两条记录?
  • 不,这些是多行多列。另一方面,我有多个具有相同标题的 csv 文件我有另一组文件,我想与第一组文件合并。我为所有要合并的文件制作了一个列表。我需要像 list <- lapply(tables, function(t)do.call((smartbind), t)) 这样的东西,但我需要基于 Year 列进行合并。
  • 你还没有真正澄清任何事情。我们需要的详细信息是关于您所谓的“合并”的特定机制。因为您的示例合并文件不符合任何合理的合并定义。请参阅下面 Brian 的回答,了解我认为您正在尝试做的事情。

标签: r list dataframe


【解决方案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 列表。

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

【讨论】:

  • 谢谢布赖恩!这在这种情况下有效,但我有基于 Year 列的我想要 rbind 的所有文件的列表列表。就像你说的那样,我在任何一年的行数都一样。
【解决方案2】:

考虑使用“plyr”包,命令“ldply”。

### 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)

【讨论】:

  • 是的,我创建了一个列表列表,其中包含我要合并的所有 2 个表。这两个表中的每一个都有不同的行数,我需要根据一列来匹配它们。
  • “ldply”命令将获取一个 data.frame 列表并将它们合并到一个 data.frame 中。合并默认是在数据集之间的同名列上合并。
猜你喜欢
  • 1970-01-01
  • 2015-12-08
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2023-04-03
  • 2021-12-17
  • 2020-11-17
相关资源
最近更新 更多