什么';使用rbind将多个.csv文件加载到R中的单个数据帧中的函数有什么问题?
我编写了以下函数来组合300.csv文件。我的目录名是“specdata”。我已经完成了以下执行步骤什么';使用rbind将多个.csv文件加载到R中的单个数据帧中的函数有什么问题?,r,csv,rbind,R,Csv,Rbind,我编写了以下函数来组合300.csv文件。我的目录名是“specdata”。我已经完成了以下执行步骤 x <- function(directory) { dir <- directory data_dir <- paste(getwd(),dir,sep = "/") files <- list.files(data_dir,pattern = '\\.csv') tables <- lapply
x <- function(directory) {
dir <- directory
data_dir <- paste(getwd(),dir,sep = "/")
files <- list.files(data_dir,pattern = '\\.csv')
tables <- lapply(paste(data_dir,files,sep = "/"), read.csv, header = TRUE)
pollutantmean <- do.call(rbind , tables)
}
# Step 2: call the function
x("specdata")
# Step 3: inspect results
head(pollutantmean)
Error in head(pollutantmean) : object 'pollutantmean' not found
x在当前函数中pollutanMean
仅在函数x
的范围内可用。将您的函数修改为此
x <- function(directory) {
dir <- directory
data_dir <- paste(getwd(),dir,sep = "/")
files <- list.files(data_dir,pattern = '\\.csv')
tables <- lapply(paste(data_dir,files,sep = "/"), read.csv, header = TRUE)
assign('pollutantmean',do.call(rbind , tables))
}
x函数中有很多不必要的代码。您可以将其简化为:
load_data <- function(path) {
files <- dir(path, pattern = '\\.csv', full.names = TRUE)
tables <- lapply(files, read.csv)
do.call(rbind, tables)
}
pollutantmean <- load_data("specdata")
load_data``{r echo=FALSE,warning=FALSE,message=FALSE}
setwd(“~/Data/R/BacklogReporting/Data/passdue/global/”)##文件所在位置
path=“~/Data/R/BacklogReporting/Data/passdue/global/”
out.file用他与莱昂内尔·亨利(Lionel Henry)合著的最新版本中的代码更新韦翰教授的上述答案:
Tbl <-
list.files(pattern="*.csv") %>%
map_df(~read_csv(.))
Tbl%
地图测向(~read\u csv()
如果类型转换是厚颜无耻的,您可以使用此命令强制所有列作为字符
Tbl <-
list.files(pattern="*.csv") %>%
map_df(~read_csv(., col_types = cols(.default = "c")))
Tbl%
map_df(~read_csv(,col_types=cols(.default=“c”))
如果您想深入子目录来构建最终要绑定的文件列表,那么请确保包含路径名,并在列表中使用文件的全名注册文件。这将允许绑定工作在当前目录之外进行。(将完整路径名视为类似于通行证的操作,以允许跨目录“边界”返回。)
Tbl%
map_df(~read_csv(,col_types=cols(.default=“c”))
正如威克姆教授所描述的(大约在中途):
map\u df(x,f)
实际上与do.call(“rbind”,lappy(x,f))
相同,但引擎盖下的效率更高
感谢Jake Kaupp向我介绍map_df()。这可以通过tidyverse的dplyr和purr非常简洁地完成。其中x是您可以简单使用的csv文件的名称列表:
bind_rows(map(x, read.csv))
将read.csv映射到x会生成一个dfs列表,该列表绑定了_行,然后整齐地组合在一起 如果您的csv文件位于其他目录中,您可以使用以下内容:
readFilesInDirectory <- function(directory, pattern){
files <- list.files(path = directory,pattern = pattern)
for (f in files){
file <- paste(directory,files, sep ="")
temp <- lapply(file, fread, sep=",")
data <- rbindlist( temp )
}
return(data)
}
readFilesInDirectory或现在使用dplyr::bind_rows
而不是已被弃用的dplyr::rbind_list
。此外,使用readr::read_csv
比read.csv
快得多。如果Coursera真的带您来这里,请阅读他们首先提供的优秀实践作业。(截至今天,链接为:)代码有效-根据Daniel Marcelino的代码修改。感谢您花时间发表评论。鉴于TidyverseVery优雅的现状,这是最好的答案。谢谢
bind_rows(map(x, read.csv))
readFilesInDirectory <- function(directory, pattern){
files <- list.files(path = directory,pattern = pattern)
for (f in files){
file <- paste(directory,files, sep ="")
temp <- lapply(file, fread, sep=",")
data <- rbindlist( temp )
}
return(data)
}