为了账号安全,请及时绑定邮箱和手机立即绑定

使用rbind将多个.csv文件加载到R中的单个数据帧中的函数有什么问题?

/ 猿问

使用rbind将多个.csv文件加载到R中的单个数据帧中的函数有什么问题?

智慧大石 2019-11-30 14:12:04

我编写了以下函数来组合300个.csv文件。我的目录名称是“ specdata”。我已经完成了以下执行步骤,


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

我怎么了 谁能解释一下?


查看完整描述

3 回答

?
慕前端131612

您的函数中有很多不必要的代码。您可以将其简化为:


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")

请注意,do.call+ rbind相对较慢。您可能会发现dplyr::bind_rows还是data.table::rbindlist要快得多。


查看完整回答
反对 2019-11-30
?
POPMUISE

要用他与莱昂内尔·亨利(Lionel Henry)合着的最新purrr库中的代码来更新维克姆教授的上述答案,请执行以下操作:


Tbl <-

    list.files(pattern="*.csv") %>% 

    map_df(~read_csv(.))

如果类型转换很不客气,您可以使用此选项将所有列强制为字符。


Tbl <-

    list.files(pattern="*.csv") %>% 

    map_df(~read_csv(., col_types = cols(.default = "c")))

如果要进入子目录来构造文件列表以进行最终绑定,请确保包括路径名,并在列表中注册文件的全名。这将使绑定工作可以在当前目录之外进行。(完整路径名应像护照一样操作,以允许在目录“边界”之间移动。)


Tbl <-

    list.files(path = "./subdirectory/",

               pattern="*.csv", 

               full.names = T) %>% 

    map_df(~read_csv(., col_types = cols(.default = "c"))) 

正如Wickham教授在这里所描述的(大约一半):


map_df(x, f)实际上与内幕相同,do.call("rbind", lapply(x, f))但效率更高。


感谢Jake Kaupp 在这里向我介绍map_df()。


查看完整回答
反对 2019-11-30
?
梵蒂冈之花

```{r echo = FALSE, warning = FALSE, message = FALSE}


setwd("~/Data/R/BacklogReporting/data/PastDue/global/") ## where file are located


path = "~/Data/R/BacklogReporting/data/PastDue/global/"

out.file <- ""

file.names <- dir(path, pattern = ".csv")

for(i in 1:length(file.names)){

  file <- read.csv(file.names[i], header = TRUE, stringsAsFactors = FALSE)

  out.file <- rbind(out.file, file)

}


write.csv(out.file, file = "~/Data/R/BacklogReporting/data/PastDue/global/global_stacked/past_due_global_stacked.csv", row.names = FALSE) ## directory to write stacked file to


past_due_global_stacked <- read.csv("C:/Users/E550143/Documents/Data/R/BacklogReporting/data/PastDue/global/global_stacked/past_due_global_stacked.csv", stringsAsFactors = FALSE)


files <- list.files(pattern = "\\.csv$") %>%  t() %>% paste(collapse = ", ")

```


查看完整回答
反对 2019-11-30
  • 3 回答
  • 0 关注
  • 187 浏览

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信