2016-05-27 48 views
1

因此,我正在为Coursera课程的R课程作业。For循环仅适用于最后一个索引号

我正在使用for循环尝试创建一个数据框,该数据框结合了332个csv文件的数据。 for循环仅返回最后一个(第332个)csv文件的数据帧。 我在做什么错?

corr <- function(directory, threshold = 0) { 

    files <- Sys.glob("specdata//*.csv") 

    ## Create empty numeric vector to append the nitrate values 
    nitr <- numeric() 
    ## Create empty numeric vector to append the sulfate values 
    sulf <- numeric() 

    for (j in 1:length(files)) { 
    read.data <- read.csv(files[j]) 
    } 
} 

回答

3
  1. directorythreshold被定义为参数但不使用。创建
  2. nitrsulf但未使用
  3. 获得文件list.files("specdata", pattern=".csv", full.names=TRUE)这样的列表通常用来
  4. 每次迭代,files[j]被读取(并取代前者),但什么都不做,然后。
  5. 你的函数也应该返回一些东西。
  6. 我不认为你真的需要一个功能,下面的代码应该做的工作。

```

files <- list.files("specdata", pattern=".csv", full.names=TRUE) 
res <- vector("list", length(files)) 
for (j in 1:length(files)) { # or seq_along(files) 
    res[[j]] <- read.csv(files[j]) 
} 
res 

```

其实这样的:

lapply(list.files("specdata", pattern=".csv", full.names=TRUE), read.csv) 

可能会工作得很好,是迄今为止更简洁,并有一个可爱的[R口音。如果你需要更多的参数为read.csv,如header=TRUE你可以将它们添加(命名,并以逗号分隔)的函数名后:

lapply(list.files("specdata", pattern=".csv", full.names=TRUE), read.csv, header=TRUE) 
3

这是一个简单的一个,你覆盖的read.data每次迭代循环。你可能想是这样的:

files <- Sys.glob("specdata//*.csv") 

## Create empty numeric vector to append the nitrate values 
nitr <- numeric() 
## Create empty numeric vector to append the sulfate values 
sulf <- numeric() 

out <- vector("list") 

for (j in 1:length(files)) { 
    out[[j]] <- read.csv(files[j]) 
} 

调试for循环的一个好方法是集合的J等于1,通过循环体运行,然后将其设置为2,做同样的事情。你也许想用seq_along(files)而不是1:length(files)当文件长度为0时,前者会给你带来不好的结果。

0

我相信这将是最快的方法。这也将显示正在完成的任务的进度条。

library(data.table) 
library(pbapply) 


# get file names 
    files <- list.files("c:/your_folder", pattern=".csv", full.names=TRUE) 

# read and pile all files 
    dt <- rbindlist(pblapply(files, fread))