如何循环遍历 R 中的 CSV 文件文件夹

kry*_*lol 6 csv loops r file

我有一个文件夹,其中包含一堆标题为“yob1980”、“yob1981”、“yob1982”等的 CSV 文件。

我必须使用 for 循环来遍历每个文件并将其内容放入数据框中 - 数据框中的列应该是“1980”、“1981”、“1982”等

这是我所拥有的:

file_list <- list.files()

temp = list.files(pattern="*.txt")
babynames <- do.call(rbind,lapply(temp,read.csv, FALSE))

names(babynames) <- c("Name", "Gender", "Count")
Run Code Online (Sandbox Code Playgroud)

我觉得我需要一个 for 循环,但我不确定如何遍历文件。有人指出我正确的方向吗?

ros*_*ova 4

我最喜欢的方法是使用包ldply中的内容plyr。它的优点是返回数据帧,因此您之后不需要执行 rbind 步骤:

library( plyr )
babynames <- ldply( .data = list.files(pattern="*.txt"),
                    .fun = read.csv,
                    header = FALSE,
                    col.names=c("Name", "Gender", "Count") )
Run Code Online (Sandbox Code Playgroud)

作为一个额外的好处,您可以非常轻松地进行多线程导入,从而使导入大型多文件数据集的速度相当快:

library( plyr )
library( doMC )
registerDoMC( cores = 4 )
babynames <- ldply( .data = list.files(pattern="*.txt"),
                    .fun = read.csv,
                    header = FALSE,
                    col.names=c("Name", "Gender", "Count"),
                    .parallel = TRUE )
Run Code Online (Sandbox Code Playgroud)

稍微更改上面的内容以Year在结果数据框中包含一列,您可以首先创建一个函数,然后ldply以与执行相同的方式执行该函数read.csv

readFun <- function( filename ) {

    # read in the data
    data <- read.csv( filename, 
                      header = FALSE, 
                      col.names = c( "Name", "Gender", "Count" ) )

    # add a "Year" column by removing both "yob" and ".txt" from file name
    data$Year <- gsub( "yob|.txt", "", filename )

    return( data )
}

# execute that function across all files, outputting a data frame
doMC::registerDoMC( cores = 4 )
babynames <- plyr::ldply( .data = list.files(pattern="*.txt"),
                          .fun = readFun,
                          .parallel = TRUE )
Run Code Online (Sandbox Code Playgroud)

这将以简洁、整洁的方式为您提供数据,这就是我建议从这里继续前进的方式。虽然可以将每年的数据分成自己的列,但这可能不是最好的方法。

注意:根据您的偏好,将Year列转换为integer类可能是个好主意。但这取决于你。