如何在R中一次对每个数据帧执行聚合?

时间:2017-06-06 14:53:44

标签: r csv for-loop dataframe aggregate

我有数千个.csv个文件,包含年份和HS信息,如下所示:

Year  HS
1956  1.06
1956  1.07
....
2012  0.95

每个csv文件代表不同的位置。 我应该做的是:

  1. 在每个文件中找到每年的最高HS
  2. 创建数千个单独的.csv文件,其中包含第1点的信息
  3. 所以,基本上我正在为每个文件重复相同的任务。

    但是,在将所有文件输入到名为df1,df2,df3...的数据框后,我无法为每个数据帧执行aggregate(无法循环数据帧)。我不知道如何“调用”数据框:

        temp = list.files(pattern="*.csv")
    for (i in 1:length(temp)) {
      assign(paste0("df",i),
             read.table(temp[i],header=TRUE,sep=";"))
    }
    for (i in 1:length(temp))
    {
      assign(paste0("ag",i),
             aggregate(HS~Year,data=df(i),max))
    }
    

    我使用那些脚本并显示:

    Error in df[i] : object of type 'closure' is not subsettable
    

    然后我改为:

    temp = list.files(pattern="*.csv")
    for (i in 1:length(temp)) {
      assign(paste0("df",i),
             read.table(temp[i],header=TRUE,sep=";"))
    }
    for (i in 1:length(temp))
    {
      assign(paste0("ag",i),
             aggregate(HS~Year,data=df(i),max))
    }
    

    它显示:

    Error in df(i) : argument "df1" is missing, with no default
    

    我尝试使用数据列表(虽然我还没有真正理解)并编写此脚本:

        temp = list.files(pattern="*.csv")
    for (i in 1:length(temp)) {
      assign(paste0("df",i),
             read.table(temp[i],header=TRUE,sep=";"))
    }
    dfl=mget(ls(pattern="df[1-length(temp)]"))
    for (i in 1:length(dfl)){
           assign(paste0("ag",i),
                  aggregate(HS~Year,data=dfl[i],max))
    }
    

    但它不起作用并显示:

      Error in eval(predvars, data, env) : object 'HS' not found
    

    我不认为输入有任何问题,因为当我对单个数据帧执行aggregatewrite.csv(没有循环)时,它是有效的。 这个问题有什么建议吗?

    谢谢。

    无论如何,我是R的新人。就像......真的很新,不到30个小时哈哈哈。所以,我意识到我可能正在写低效的脚本。如果有人也想提出更好的剧本,我会很高兴。

1 个答案:

答案 0 :(得分:0)

获取文件名files,在提供数据框列表{@ 1}}时阅读它们,并将L应用于每个文件。 aggregate将是汇总数据框的列表。

Ag

或者如果您不需要或者不能将L最后两行合并到:

files <- Sys.glob("*.csv")
L <- lapply(files, read.table, header = TRUE, sep = ";")
Ag <- lapply(L, aggregate, formula = HS ~ Year, FUN = max)