[英]R iterate to read csv files
pollutantmean <- function(id){
n <- length(id)
for (i in 1 : n){
pol <- read.csv('id[i].csv')
}
}
pollutantmean(150:160)
csv的文件名類似於001.csv,002.csv,100.csv等001、002和100,它們是id,並且每個csv都有一個id列,如果文件名是001,則其內容為1。
當我運行此代碼時,控制台會提醒我這不是此類文件ID [i] .csv
首先,您不需要循環。 其次,您需要考慮如何表示id。
ids <- sprintf("%03i", 1:999) # 0's are padded at the beginning
filenames <- paste0(ids, ".csv")
results <- lapply(filenames, read.csv) # you get a list of data frames
或者,您可以使用以下命令讀取特定文件夾中的所有csv文件:
results <- lapply(dir(pattern="\\.csv$"), read.csv)
“ \\ .csv $”表示“ .csv”必須位於文件名的末尾。 (有關詳細信息,請參見?regexpr)
...以及一個接受數字並返回數據框的函數,如下所示:
read.this <- function(i) read.csv(sprintf("%003i.csv",i))
...現在您可以將其應用到所需的范圍:
lapply(101:150, read.this)
第一個問題是第4行,應將其替換為
pol <- read.csv(paste0(id[i], ".csv"))
如果id[i]
引號引起來(單引號或雙引號),則read.csv可以read.csv
理解它,例如,該函數正在查找名為id[i].csv
,並解釋了錯誤消息。
但是有了這樣的功能,無論如何在任何一步都將覆蓋pol
。
如果您確實要將這些行包裝到一個函數中,則需要返回一個列表:
pollutantmean <- function(id){
res <- vector("list", length(id))
for (i in 1:n){
res[[i]] <- read.csv(paste0(id[i], ".csv"))
}
}
但是這里的循環並不是很優雅,所以我們可以簡單地:
pollutantmean <- function(id){
lapply(id, function(i) read.csv(paste0(i, ".csv"))
}
甚至(沒有功能選項),這應該可以工作:
lapply(id, function(i) read.csv(paste0(i, ".csv"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.