【问题标题】:Add multiple dataframes to one dataframe without overwriting the existing dataframe in R将多个数据帧添加到一个数据帧而不覆盖 R 中的现有数据帧
【发布时间】:2020-09-26 01:49:20
【问题描述】:

我有332个csv文件,每个文件有相同数量的变量和相同的格式,我需要创建一个函数,每次用户调用它时,可以指定csv文件所在的文件夹和id他们想要存储在一个数据框中的 csv 文件。

文件名遵循以下格式:001.csv、002.csv ... 332.csv。

data <- function(directory, id_default = 1:332){
setwd(paste0("/Users/", directory))

id <- id_default

for(i in length(id)){
    if(i < 10){
        aux <- paste0("00",i)
        filename <- paste0(aux,".csv")
    }else if(i < 100){
        aux <- paste0("0", i)
        filename <- paste0(aux, ".csv")
    }else if(i >= 100){
        filename <- paste0(i, ".csv")
    }
    my_dataframe <- do.call(rbind, lapply(filename, read.csv))

}
my_dataframe #Print dataframe

}

但问题是它只存储最后一个 csv 文件,似乎每次进入循环时它都会用最后一个 csv 文件覆盖数据帧。 我如何解决它?请帮忙

【问题讨论】:

标签: r dataframe


【解决方案1】:

在这里,我们遍历最后一个“id”,即length。相反,它应该是

for(i in 1:length(id))

或者更准确地说

for(i in seq_along(id))

除了循环问题之外,if/else if 并不是真正需要的。我们可以使用sprintf

filenames <- sprintf('%03d.csv', id)

data <- function(directory, id_default = 1:332){
     setwd(paste0("/Users/", directory))
     filenames <-  sprintf('%03d.csv', id_default)
     do.call(rbind, lapply(filenames, read.csv))
 }

【讨论】:

  • 约翰霍普金斯大学 R 编程 第一次编程作业的另一个副本...... 332 个文件是赠品。
【解决方案2】:

一个整洁的解决方案将使用purrr(比此任务的循环更好):https://purrr.tidyverse.org/reference/map.html

library(tidyverse)
directory <- "directory"
id <- c(1,20,300)

# add leading 0s with stringr's str_pad
id %<>% str_pad(3, pad = "0")

最好避免像这样使用setwd()

改为将directory 添加到文件路径中。

paths <- str_c(directory, "/", id, ".csv")

# map files to that function (similar to a loop) and stack rows
map_dfr(paths, read_csv)

更好的是,使用here()--它使文件路径有效:https://github.com/jennybc/here_here

paths <- str_c(
      here::here(directory, id),
      ".csv")

# map files to that function (similar to a loop) and stack rows
map_dfr(paths, read_csv)

您的示例似乎希望将默认 id 设为 1:332。如果我们想要目录中的所有文件,我们可以使用paths &lt;- list.files(here::here(directory))

read_my_data <- function(directory, id = 1:332){
  paths <- str_c(
      here::here(directory, str_pad(id, 3, pad = "0")),
      ".csv")
  map_dfr(paths, read_csv)
} 

read_my_data("directory")

如果需要并行合并多个目录的文件,可以使用pmap_dfr()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-18
    • 2022-01-25
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多