簡體   English   中英

迭代讀取csv文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM