我有一个文件夹,其中包含一堆标题为“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")
我觉得我需要一个 for 循环,但我不确定如何遍历文件。有人指出我正确的方向吗?
最佳答案
我最喜欢的方法是使用 ldply
来自 plyr
包裹。它具有返回数据帧的优点,因此您无需在之后执行 rbind 步骤:
library( plyr )
babynames <- ldply( .data = list.files(pattern="*.txt"),
.fun = read.csv,
header = FALSE,
col.names=c("Name", "Gender", "Count") )
作为额外的好处,您可以非常轻松地进行多线程导入,从而使大型多文件数据集的导入速度更快:
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 )
稍微更改以上内容以包含
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 )
这将以简洁整洁的方式为您提供数据,这就是我建议从这里向前推进的方式。虽然然后可以将每年的数据分成自己的列,但这可能不是最好的方法。
注意:根据您的喜好,转换
Year
可能是个好主意。列说,integer
类(class)。但这取决于你。
关于r - 如何循环遍历 R 中的 CSV 文件文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40063507/