我有一个文件夹,其中包含一堆标题为“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 循环,但我不确定如何遍历文件。有人指出我正确的方向吗?
我最喜欢的方法是使用包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类可能是个好主意。但这取决于你。