R for循环 - 在循环外追加结果
问题描述:
我正在Cousera上介绍R编程课程。第一项任务是评估指定目录中数百个csv文件的列表(“./specdata/”),每个csv文件又包含数百个大气中样本污染物数据记录 - 日期,亚硫酸盐样本,硝酸盐样本和标识采样位置的IDR for循环 - 在循环外追加结果
该任务要求我们创建一个函数,该函数将污染物作为采样位置的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
}
答
您可以在for循环之外定义数据框并追加到它。您也可以通过调用只有你df <- rbind(df)
有效覆盖df
每次跳过之间......还有更多的方法来改善这里... :-)
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)
}
答
一些步骤。你可以做这样的事情解决这个问题:
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
将事先那么这是不这样做的正确方法。
[list.files](http://www.inside-r.org/r-doc/base/list.files)有一个* full.names *(默认设置为False)参数,所以不需要粘贴目录。另外,read.csv不会导入数据框,所以不需要'data.frame()'行。而'na.omit()'可能是多余的,因为'list.files'从指定的路径中选择所有非丢失的文件。如果你的意思是跳过空行,[read.table](http://www.inside-r.org/r-doc/utils/read.csv),'read.csv'的派生函数就有这样一个参数(默认为真)。 – Parfait