我有大量的csv文件,我想读入R.所有csvs中的列标题是相同的.起初我以为我需要根据文件名列表创建一个循环,但在搜索之后我发现了一种更快的方法.这将正确读入并组合所有csvs(据我所知).
filenames <- list.files(path = ".", pattern = NULL, all.files = FALSE, full.names = FALSE, recursive = FALSE, ignore.case = FALSE)
library(plyr)
import.list <- llply(filenames, read.csv)
combined <- do.call("rbind", import.list)
Run Code Online (Sandbox Code Playgroud)
唯一的问题是我想知道特定行数据来自哪个csv.我想要一个标有"source"的列,其中包含特定行来自的csv的名称.所以例如,如果csv被称为Chicago_IL.csv,当数据进入R时,行看起来像这样:
> City State Market etc Source
> Burbank IL Western etc Chicago_IL
Run Code Online (Sandbox Code Playgroud)
And*_*rie 23
你已经完成了所有艰苦的工作.通过相当小的修改,这应该是直截了当的.
逻辑是:
以下应该有效:
read_csv_filename <- function(filename){
ret <- read.csv(filename)
ret$Source <- filename #EDIT
ret
}
import.list <- ldply(filenames, read_csv_filename)
Run Code Online (Sandbox Code Playgroud)
请注意,我已经对您的代码提出了另一个小改进:read.csv()返回一个data.frame - 这意味着您可以使用ldply()而不是llply().
G. *_*eck 13
试试这个:
do.call("rbind", sapply(filenames, read.csv, simplify = FALSE))
Run Code Online (Sandbox Code Playgroud)
行名称将指示源和行号.
这是一个使用rioimport_list()
函数的解决方案,它正是为此目的而设计的。
# setup some example files to import
rio::export(mtcars, "mtcars1.csv")
rio::export(mtcars, "mtcars2.csv")
rio::export(mtcars, "mtcars3.csv")
Run Code Online (Sandbox Code Playgroud)
的默认行为import_list()
是获取数据框列表:
str(rio::import_list(dir(pattern = "mtcars")), 1)
## List of 3
## $ :'data.frame': 32 obs. of 11 variables:
## $ :'data.frame': 32 obs. of 11 variables:
## $ :'data.frame': 32 obs. of 11 variables:
Run Code Online (Sandbox Code Playgroud)
但是您可以使用rbind
参数来代替构建单个数据框(注意_file
末尾的列):
str(rio::import_list(dir(pattern = "mtcars"), rbind = TRUE))
## 'data.frame': 96 obs. of 12 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : int 6 6 4 6 8 6 8 4 4 6 ...
## $ disp : num 160 160 108 258 360 ...
## $ hp : int 110 110 93 110 175 105 245 62 95 123 ...
## $ drat : num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec : num 16.5 17 18.6 19.4 17 ...
## $ vs : int 0 0 1 1 0 1 0 1 1 1 ...
## $ am : int 1 1 1 0 0 0 0 0 0 0 ...
## $ gear : int 4 4 4 3 3 3 3 4 4 4 ...
## $ carb : int 4 4 1 1 2 1 4 2 2 4 ...
## $ _file: chr "mtcars1.csv" "mtcars1.csv" "mtcars1.csv" "mtcars1.csv" ...
Run Code Online (Sandbox Code Playgroud)
以及rbind_label
用于指定标识每个文件的列名称的参数:
str(rio::import_list(dir(pattern = "mtcars"), rbind = TRUE, rbind_label = "source"))
## 'data.frame': 96 obs. of 12 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : int 6 6 4 6 8 6 8 4 4 6 ...
## $ disp : num 160 160 108 258 360 ...
## $ hp : int 110 110 93 110 175 105 245 62 95 123 ...
## $ drat : num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec : num 16.5 17 18.6 19.4 17 ...
## $ vs : int 0 0 1 1 0 1 0 1 1 1 ...
## $ am : int 1 1 1 0 0 0 0 0 0 0 ...
## $ gear : int 4 4 4 3 3 3 3 4 4 4 ...
## $ carb : int 4 4 1 1 2 1 4 2 2 4 ...
## $ source: chr "mtcars1.csv" "mtcars1.csv" "mtcars1.csv" "mtcars1.csv" ...
Run Code Online (Sandbox Code Playgroud)
完整披露:我是 rio 的维护者。
归档时间: |
|
查看次数: |
12899 次 |
最近记录: |