【问题标题】:Read multiple csv data and create new columns at one time一次读取多个 csv 数据并创建新列
【发布时间】:2017-11-02 07:54:19
【问题描述】:

我有一个文件,里面有很多 csv 数据。
我想一次阅读它们并创建新列,然后合并到一个数据表中。我在这里解释更多。

  1. 看这张照片:

  1. 我想根据 csv 数据标题创建 2 个新列 YEARMONTH
    前任。以201508 Sales Report(London) 为例。我想创建YEAR = 2015MONTH = 8

  2. 我不知道该怎么做,但我可以一次阅读它们而无需创建新列。

    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,它可以工作了。

【问题讨论】:

  • 使用list.files 读取列表中的文件并使用rbindlistidcol 参数(see here for an example)将它们绑定在一起。最后使用DT[, YEAR := substr(id,1,4)] 获取年份,DT[, MONTH := substr(id,5,6)] 获取月份。
  • 你能解释更多吗?我认为这很棒,但我无法理解
  • 添加了一个更广泛的答案,应该更清楚。 HTH
  • 你必须先设置你的工作主管,这样YEAR = substr(id,5,8), MONTH = substr(id,9,10)才能工作。如果你不设置它,你应该考虑你所有的路径

标签: r function csv data.table fread


【解决方案1】:

扩展我的评论并假设所有文件具有相同的结构,以下应该可以工作:

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,并添加了 YEARMONTH 列。

如果你想从文件中排除某些列,你可以使用drop-参数fread如下:

dt.list <- sapply(file.list, fread, drop = c(1,7,10,12:15,17), simplify=FALSE)

【讨论】:

  • 除非您使用USE.NAMES,否则使用sapplysimplify = FALSE 与使用lapply 完全相同(sapply 调用lapply
  • simplify = False 是什么意思?
  • 这个答案很棒。如果我想创建一个像我上面的问题my_read_data 这样的函数并使用你的方式,我该怎么办?我收到一个错误,我将编辑我的上述问题
  • @PeterChen 很抱歉这么晚才回复,你还有这个问题吗?
  • @PeterChen 通过使用simplify=FALSE,data.table 的列表变成了一个命名列表(以文件名作为名称)。 simplify=TRUE 是默认值,将创建一个未命名列表。将rbindlist 应用于未命名列表时,id 列仅获取数字。将rbindlist 应用于命名列表(即使用simplify=FALSE 的结果),id 列将获取相应文件的名称。 See here 获取有关阅读文件列表的更广泛答案。
【解决方案2】:

以下是包含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

【讨论】:

    猜你喜欢
    • 2017-08-07
    • 2021-05-14
    • 2018-02-01
    • 2014-03-29
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多