R for循环 - 在循环外附加结果

时间:2016-04-14 12:48:48

标签: r loops

我正在参加Cousera的入门R编程课程。第一项任务让我们评估指定目录(“./specdata/”)中数百个csv文件的列表。每个csv文件反过来包含数百个大气中样本污染物数据的记录 - 日期,亚硫酸盐样本,一个硝酸盐样本,以及一个识别采样位置的ID。

赋值要求我们创建一个函数,该函数将污染物作为id的id或范围进行采样,并根据提供的参数返回样本均值。

我的代码(下面)使用for循环来使用id参数只读取感兴趣的文件(在进行任何处理之前,似乎比读取所有322个文件更有效)。这很有效。

在循环中,我将csv文件的内容分配给变量。然后,我将该变量设为数据框,并使用rbind将每个循环期间读入的文件附加到其中。我使用na.omit从变量中删除丢失的文件。然后我使用rbind将循环的每次迭代的结果附加到变量。当我在循环中打印数据框变量时,我可以看到整个完整列表,由id进行子分组。但是当我在循环外打印变量时,我只看到id向量中的最后一个元素。

我想在循环中创建与id参数匹配的所有记录的合并列表,然后在循环外传递合并列表以进行进一步处理。我不能让这个工作。我的代码如下所示。

这是错误的做法吗?好像它可以工作。非常感激任何的帮助。我搜索了StackOverflow并找不到任何可以解决我想要做的事情。

pmean <- function(directory = "./specdata/", pollutant, id = 1:322)  {

  x <- list.files(path=directory, pattern="*.csv")
  x <- paste(directory, x, sep="")

  id1 <- id[1]
  id2 <- id[length(id)]

  for (i in id1:id2) {

    df <- read.csv(x[i], header = TRUE)
    df <- data.frame(df)        
    df <- na.omit(df)
    df <- rbind(df)

    print(df)

    }   

    # would like a consolidated list of records here to to do more stuff, e.g. filter on pollutant and calcuate mean

}

2 个答案:

答案 0 :(得分:0)

您可以在for循环外定义数据框并附加到它。你也可以跳过它们之间的一些步骤...这里有更多的改进方法......: - )

pmean <- function(directory = "./specdata/", pollutant, id = 1:322)  {

  x <- list.files(path=directory, pattern="*.csv")
  x <- paste(directory, x, sep="")

  df_final <- data.frame()
  for (i in id) {

    df <- read.csv(x[i], header = TRUE)
    df <- data.frame(df)        
    df <- na.omit(df)
    df_final <- rbind(df_final, df)

    print(df)

    }   

    # would like a consolidated list of records here to to do more stuff, e.g. filter on pollutant and calcuate mean
    return(df_final)
}

答案 1 :(得分:0)

仅通过调用df <- rbind(df),您每次都会有效地覆盖df。您可以通过执行以下操作来解决此问题:

df = data.frame() # empty data frame
for(i in 1:10) { # for all you csv files
  x <- mean(rnorm(10)) # some new information
  df <- rbind(df, x) # bind old dataframe and new value
}

顺便说一下,如果你事先知道df有多大,那么这不是正确的做法。