以下是合法的,因为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 =()列表,但它不起作用。
答案 0 :(得分:1)
您可以将工作目录设置为包含文件的文件夹,然后为该目录中包含“.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文件怎么办?您不希望每次都更改代码。因此,如果您想多次执行某些操作,则不应该只复制和粘贴代码行。
我认为这里最好的方法是定义一个自定义函数,该函数使用您使用的参数读取文件。然后,获取要读取的所有文件的列表。这可以手动输入,也可以使用list.files
之类的内容来获取目录中文件的名称。然后,您可以使用lapply
或purrr::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
。