2017-06-01 83 views
1

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

  1. 看这个图:

enter image description here

  • 我想基于CSV数据标题就可以创建2分新列YEARMONTH
    ex。以201508 Sales Report(London)为例。我想创建YEAR = 2015MONTH = 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)因为每个数据的标题有编号前4个系统字符。恩。 AAA-201508销售报告
    但是,它不起作用。
    感谢@Peter TW,它的工作原理。

    +4

    与获取列表中的文件'list.files'读取它们并将它们绑定通过使用'rbindlist'的'idcol'-参数([请参阅此处的示例](https://stackoverflow.com/questions/32888757/reading-multiple-files-into-r-best-practice))。最后使用'DT [,YEAR:= substr(id,1,4)]'获取年份和DT [,MONTH:= substr(id,5,6)]'获取月份。 – Jaap

    +0

    你能解释一下吗?我认为这很好,但我不明白 –

    +0

    增加了更广泛的答案,应该更清楚。 HTH – Jaap

    回答

    4

    扩大对我的评论,并假定所有文件具有相同的结构,下面应该工作:

    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 -parameter的fread如下:

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

    除非你使用'USE.NAMES',否则使用'simplify = FALSE'的'sapply'与使用'lapply'('sapply')调用完全相同'lapply') – MichaelChirico

    +0

    'simplify = False'是什么意思? –

    +0

    这个答案很好。如果我想创建一个像我上面的问题'my_read_data'的函数并使用你的方式,我该怎么办?我收到一个错误,我将编辑我的上述问题 –

    0

    这里是你如何能包括与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