一次读取多个 csv 数据并创建新列
Read multiple csv data and create new columns at one time
我有一个文件,里面有很多csv
数据。
我想一次读取它们并创建新列,然后合并到一个数据表中。我在这里解释更多。
- 看这张照片:
我想根据 csv 数据标题创建 2 个新列 YEAR
和 MONTH
。
前任。以201508 Sales Report(London)
为例。我想创建 YEAR = 2015
和 MONTH = 8
。
我不知道该怎么做,但我可以一次阅读它们而无需创建新栏目。
my_read_data <- function(path){
data <- data.table::fread(path, header = T, strip.white = T, fill = T)
data <- data[data[[5]] != 0,]
data <- subset(data, select = c(-1,-7,-10,-12,-13,-14,-15,-17))
}
file.list <- dir(path = "//path/", pattern='\.csv', full.names = T)
df.list <- lapply(file.list, my_read_data)
dt <- rbindlist(df.list)
如何修改我的代码?
其实我不确定我的代码是否正确。
欣赏。
感谢@Jaap
,我的新密码是:
my_read_data <- function(x){
data <- data.table::fread(x, header = T, strip.white = T, fill = T)
data <- data[data[[5]] != 0,]
data <- subset(data, select = c(-1,-7,-10,-12,-13,-14,-15,-17))
}
file.list <- list.files(path = "/path/", pattern = '*.csv')
dt.list <- sapply(file.list, my_read_data, simplify=FALSE)
但是,我得到一个错误。
Error in data.table::fread(x, header = T, strip.white = T, fill = T) :
File not found: C:\Users\PECHEN\AppData\Local\Temp\RtmpiihFR4\filea0c4d726488
In addition: Warning messages:
1: running command 'C:\Windows\system32\cmd.exe /c (TWM-201508 Sales Report(London).csv) > C:\Users\PECHEN\AppData\Local\Temp\RtmpiihFR4\filea0c4d726488' had status 1
2: In shell(paste("(", input, ") > ", tt, sep = "")) :
'(TWM-201508 Sales Report(London).csv) > C:\Users\PECHEN\AppData\Local\Temp\RtmpiihFR4\filea0c4d726488' execution failed with error code 1
此外,我编辑我的代码:
my_read_data <- function(x){
data <- data.table::fread(x, header = T, strip.white = T, fill = T)
data <- data[data[[5]] != 0,]
data <- subset(data, select = c(-1,-7,-10,-12,-13,-14,-15,-17))
}
file.list <- dir(path = "/path/", pattern='\.csv', full.names = T)
df.list <- lapply(file.list, my_read_data)
dt <- rbindlist(df.list, idcol = 'id')[, `:=` (YEAR = substr(id,5,8), MONTH = substr(id,9,10))]
我使用 YEAR = substr(id,5,8), MONTH = substr(id,9,10)
因为每个数据标题在数字前都有四个字符。前任。 AAA-201508销售报告
但是,它不起作用。
感谢 @Peter TW
,它有效。
以下是如何包含带有 dplyr
的列:
nam <- c("201508 Sales Report(London)", "201509 Sales Report(London)", "201604 Sales Report(London)-Monthly")
dat <- data.frame(file=nam, var=nam)
dat %>%
separate(var, into=c(paste0("parts", 1:5))) %>%
mutate(Year=substring(parts1, 1,4), Month=substring(parts1, 5,6)) %>%
select(Year, Month, file)
# Year Month file
# 1 2015 08 201508 Sales Report(London)
# 2 2015 09 201509 Sales Report(London)
# 3 2016 04 201604 Sales Report(London)-Monthly
扩展我的评论并假设所有文件都具有相同的结构,以下应该有效:
library(data.table)
# get list of file-names
file.list <- list.files(pattern='*.csv')
# read the files with sapply & fread
# this will create a named list of data.tables
dt.list <- sapply(file.list, fread, simplify=FALSE)
# bind the list together to one data.table
# using the 'idcol'-parameter puts the names of the data.tables in the id-column
# create the YEAR & MONTH variables with 'substr'
DT <- rbindlist(dt.list, idcol = 'id')[, `:=` (YEAR = substr(id,1,4), MONTH = substr(id,5,6))]
这将导致一个 data.table 包含所有数据并添加了 YEAR
和 MONTH
列。
如果要从文件中排除某些列,可以使用 fread
的 drop
参数,如下所示:
dt.list <- sapply(file.list, fread, drop = c(1,7,10,12:15,17), simplify=FALSE)
我有一个文件,里面有很多csv
数据。
我想一次读取它们并创建新列,然后合并到一个数据表中。我在这里解释更多。
- 看这张照片:
我想根据 csv 数据标题创建 2 个新列
YEAR
和MONTH
。
前任。以201508 Sales Report(London)
为例。我想创建YEAR = 2015
和MONTH = 8
。我不知道该怎么做,但我可以一次阅读它们而无需创建新栏目。
my_read_data <- function(path){ data <- data.table::fread(path, header = T, strip.white = T, fill = T) data <- data[data[[5]] != 0,] data <- subset(data, select = c(-1,-7,-10,-12,-13,-14,-15,-17)) } file.list <- dir(path = "//path/", pattern='\.csv', full.names = T) df.list <- lapply(file.list, my_read_data) dt <- rbindlist(df.list)
如何修改我的代码?
其实我不确定我的代码是否正确。
欣赏。
感谢@Jaap
,我的新密码是:
my_read_data <- function(x){
data <- data.table::fread(x, header = T, strip.white = T, fill = T)
data <- data[data[[5]] != 0,]
data <- subset(data, select = c(-1,-7,-10,-12,-13,-14,-15,-17))
}
file.list <- list.files(path = "/path/", pattern = '*.csv')
dt.list <- sapply(file.list, my_read_data, simplify=FALSE)
但是,我得到一个错误。
Error in data.table::fread(x, header = T, strip.white = T, fill = T) :
File not found: C:\Users\PECHEN\AppData\Local\Temp\RtmpiihFR4\filea0c4d726488
In addition: Warning messages:
1: running command 'C:\Windows\system32\cmd.exe /c (TWM-201508 Sales Report(London).csv) > C:\Users\PECHEN\AppData\Local\Temp\RtmpiihFR4\filea0c4d726488' had status 1
2: In shell(paste("(", input, ") > ", tt, sep = "")) :
'(TWM-201508 Sales Report(London).csv) > C:\Users\PECHEN\AppData\Local\Temp\RtmpiihFR4\filea0c4d726488' execution failed with error code 1
此外,我编辑我的代码:
my_read_data <- function(x){
data <- data.table::fread(x, header = T, strip.white = T, fill = T)
data <- data[data[[5]] != 0,]
data <- subset(data, select = c(-1,-7,-10,-12,-13,-14,-15,-17))
}
file.list <- dir(path = "/path/", pattern='\.csv', full.names = T)
df.list <- lapply(file.list, my_read_data)
dt <- rbindlist(df.list, idcol = 'id')[, `:=` (YEAR = substr(id,5,8), MONTH = substr(id,9,10))]
我使用 YEAR = substr(id,5,8), MONTH = substr(id,9,10)
因为每个数据标题在数字前都有四个字符。前任。 AAA-201508销售报告
但是,它不起作用。
感谢 @Peter TW
,它有效。
以下是如何包含带有 dplyr
的列:
nam <- c("201508 Sales Report(London)", "201509 Sales Report(London)", "201604 Sales Report(London)-Monthly")
dat <- data.frame(file=nam, var=nam)
dat %>%
separate(var, into=c(paste0("parts", 1:5))) %>%
mutate(Year=substring(parts1, 1,4), Month=substring(parts1, 5,6)) %>%
select(Year, Month, file)
# Year Month file
# 1 2015 08 201508 Sales Report(London)
# 2 2015 09 201509 Sales Report(London)
# 3 2016 04 201604 Sales Report(London)-Monthly
扩展我的评论并假设所有文件都具有相同的结构,以下应该有效:
library(data.table)
# get list of file-names
file.list <- list.files(pattern='*.csv')
# read the files with sapply & fread
# this will create a named list of data.tables
dt.list <- sapply(file.list, fread, simplify=FALSE)
# bind the list together to one data.table
# using the 'idcol'-parameter puts the names of the data.tables in the id-column
# create the YEAR & MONTH variables with 'substr'
DT <- rbindlist(dt.list, idcol = 'id')[, `:=` (YEAR = substr(id,1,4), MONTH = substr(id,5,6))]
这将导致一个 data.table 包含所有数据并添加了 YEAR
和 MONTH
列。
如果要从文件中排除某些列,可以使用 fread
的 drop
参数,如下所示:
dt.list <- sapply(file.list, fread, drop = c(1,7,10,12:15,17), simplify=FALSE)