【问题标题】:How to Perform Aggregate on Each Data Frame at once in R?如何在 R 中一次对每个数据帧执行聚合?
【发布时间】:2017-11-07 15:59:46
【问题描述】:

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

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

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

  1. 找到每个文件每年的最大 HS
  2. 创建数千个单独的 .csv 文件,其中包含第 1 点的信息

所以,基本上我对每个文件重复相同的任务。

但是,在将所有文件输入到名称为 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 小时哈哈哈。所以,我意识到我可能正在编写低效的脚本。如果有人也想建议更好的脚本,我会很高兴。

【问题讨论】:

    标签: r csv for-loop dataframe aggregate


    【解决方案1】:

    获取文件名files,读取它们并给出数据框列表L,然后将aggregate 应用于每个数据框。 Ag 将是聚合数据帧的列表。

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

    或者如果您不需要或负担不起存储 L 的费用,请将最后两行合并到:

    Ag <- lapply(files, 
     function(f) aggregate(HS ~ Year, read.table(f, header = TRUE, sep = ";"), max))
    

    【讨论】:

    • 它说:Error in FUN(X[[i]], ...) : only defined on a data frame with all numeric variables 老实说,read.csv 对我的数据来说似乎不起作用。以前我使用read.csv 输入我的 csv 文件,它存储到 1 个变量,即使对于单个数据帧我也无法执行聚合。
    • 假设您代码中的 read.table 命令有效,我已将其更改为 read.table。
    猜你喜欢
    • 2015-08-12
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多