我正在参加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
}
答案 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
有多大,那么这不是正确的做法。