在R中,如何在加载多个csv文件时只定义一次列类型?

时间:2018-03-20 13:32:14

标签: r csv readr

以下是合法的,因为consolidating data frames in R没有答案,也没有How to make a great R reproducible example?

我有一个分析在多个csv文件中没有标题的数据集。对于单个导入,我使用:

X <- read_delim( ... ,
                 ... ,
                 col_types = col(    X1 = "c" ,
                                     ...      ,  
                                   X100 = "i"  )
               )

要导入所有,我只需重复以上

我想缩短代码

是否可以通过仅定义一次来将 col()的列定义提供给 read_delim ?我试图提供 c =()列表,但它不起作用。

2 个答案:

答案 0 :(得分:1)

lapply()的解决方案:

您可以将工作目录设置为包含文件的文件夹,然后为该目录中包含“.csv”的所有文件创建文件路径列表。最后,您可以使用lapply在文件路径列表上应用read.csv函数。 我认为您应该使用read.csv,因为您有.csv文件。您可以在lapply调用中设置colClasses,并且对于您拥有的所有.csv文件,它们的读取方式相同放在你的工作目录里。

Link to lapply() documentation

您可以尝试这样的事情:

setwd( "C:/path/to/directory/containing/files/here/")   

file.paths <- list.files(pattern = '.csv')

column_classes <- c("character", "numeric", "numeric") # specify for all columns   

my.files <- lapply(file.paths, function(x) read.csv(x, colClasses= column_classes))

答案 1 :(得分:0)

如果你想制作出色的代码,你似乎不应该重复自己。如果您再获得100个csv文件怎么办?您不希望每次都更改代码。因此,如果您想多次执行某些操作,则不应该只复制和粘贴代码行。

Don't repeat yourself

我认为这里最好的方法是定义一个自定义函数,该函数使用您使用的参数读取文件。然后,获取要读取的所有文件的列表。这可以手动输入,也可以使用list.files之类的内容来获取目录中文件的名称。然后,您可以使用lapplypurrr::map将自定义函数应用于每个文件名。

library(readr)
library(purrr)

read_my_file <- function(filename){
  read_delim( ... ,
              ... ,
              col_types = col(    X1 = "c" ,
                                  ...      ,  
                                  X100 = "i"  )
  )
}


filenames <- c("one.csv", "two.csv", "three.csv")

dataframes <- map(filenames, read_my_file)

如果您希望将所有数据框(按行)连接成一个大数据框,请使用map_dfr代替map