Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R for循环-将结果附加到循环之外_R_Loops - Fatal编程技术网

R for循环-将结果附加到循环之外

R for循环-将结果附加到循环之外,r,loops,R,Loops,我正在上一门关于库塞拉的R编程入门课程。第一项任务要求我们评估指定目录(“./specdata/”)中数百个csv文件的列表。每个csv文件依次包含数百个大气污染物样本数据记录——一个日期、一个亚硫酸盐样本、一个硝酸盐样本和一个标识采样位置的ID 赋值要求我们创建一个函数,根据提供的参数,该函数获取污染物的id或id范围作为采样位置,并返回采样平均值 我的代码(下面)使用for循环,使用id参数只读取感兴趣的文件(似乎比在进行任何处理之前读取所有322个文件更有效)。这非常有效 在循环中,我将c

我正在上一门关于库塞拉的R编程入门课程。第一项任务要求我们评估指定目录(“./specdata/”)中数百个csv文件的列表。每个csv文件依次包含数百个大气污染物样本数据记录——一个日期、一个亚硫酸盐样本、一个硝酸盐样本和一个标识采样位置的ID

赋值要求我们创建一个函数,根据提供的参数,该函数获取污染物的id或id范围作为采样位置,并返回采样平均值

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

在循环中,我将csv文件的内容分配给一个变量。然后我将该变量设置为数据帧,并使用
rbind
将每个循环中读取的文件附加到该变量。我使用
na。省略
从变量中删除缺少的文件。然后我使用
rbind
将循环每次迭代的结果附加到v变量。当我在循环内打印数据帧变量时,我可以看到整个完整列表,按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

}

pmean您可以在for循环之外定义数据帧并附加到它。您还可以跳过中间的一些步骤…这里有更多的改进方法…:-)

pmean只调用
df有一个full.names(默认设置为False)参数,因此不需要粘贴目录。另外,read.csv会导入到数据框中,因此不需要
data.frame()
line.和
na.omit()
可能是多余的,因为
列出.files
从指定路径中拾取所有未丢失的文件。如果您的意思是跳过空行,则
read.csv
的派生函数有这样一个参数(默认为True)。
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
}