【问题标题】:Reading multiple csv of same format in a data frame在一个数据框中读取多个相同格式的csv
【发布时间】:2014-02-20 13:14:05
【问题描述】:

我需要为多个 CSV 文件运行同一组代码。我想用宏做同样的事情。下面是我正在执行的代码,但结果不正确。它正在以 2-d 格式读取数据,而我需要以 3-d 格式运行。

lf = list.files(path = "D:/THD/data", pattern = ".csv",
                full.names = TRUE, recursive = TRUE, include.dirs = TRUE)
ds<-lapply(lf,read.table)

【问题讨论】:

  • 也许你需要read.csv 而不是read.table。但是不知道文件是什么样子(即输入和您的预期输出),很难帮助您。
  • 您需要将适当的参数传递给read.table

标签: r csv macros dataframe


【解决方案1】:

我不知道这是否有用,但我的方法之一是:

 ##Step 1 read files 

       mycsv = dir(pattern=".csv")

        n <- length(mycsv) 

    mylist <- vector("list", n) 

    for(i in 1:n) mylist[[i]] <- read.csv(mycsv[i],header = T) 

然后我通常只使用 apply 函数来更改内容,例如,

 ##  Change coloumn name
    mylist <- lapply(mylist, function(x) {names(x) <- c("type","date","v1","v2","v3","v4","v5","v6","v7","v8","v9","v10","v11","v12","v13","v14","v15","v16","v17","v18","v19","v20","v21","v22","v23","v24","total") ; return(x)}) 

    ##  changing type coloumn for weekday/weekend

    mylist <- lapply(mylist, function(x) {
        f = c("we", "we", "wd", "wd", "wd", "wd", "wd")
        x$type = rep(f,52, length.out = 365)
        return(x)
    }) 


and so on. 

然后我在进行所有更改后再次使用以下代码保存(有时拆分原始文件名并重命名每个文件以使用文件名的一部分保存,以便我以后可以跟踪每个单独的文件)

##  for example some of my file had a pattern in file name such as "201_E424220_N563500.csv",so I split this to save with a new name like this:    

mylist <-lapply(1:length(mylist), function(i) {
    mylist.i <- mylist[[i]]     
    s = strsplit(mycsv[i], "_" , fixed = TRUE)[[1]]     
    d = cbind(mylist.i[, c("type", "date")], ID = s[1], Easting = s[2], Northing = s[3], mylist.i[, 3:ncol(mylist.i)])     
    return(d) 
})

for(i in 1:n)    
    write.csv(file = paste("file", i, ".csv", sep = ""),    mylist[i], row.names = F)

我希望这会有所帮助。当你有时间请阅读 PLYR 包,因为我相信这对你非常有用,它是一个非常有用的包,有很多数据分析选项。 PLYR 具有以下应用功能:

## l_ply   split list, apply function and discard result 
## ldply   split list, apply function and return result in data frame 
## laply   split list, apply function and return result in an array

例如,您可以使用 ldply 读取所有 csv 并返回类似以下内容的数据框:

data = ldply(list.files(pattern = ".csv"), function(fname) {

  j = read.csv(fname, header = T)

  return(j)

})

所以这里 J 将是您的数据框,其中包含所有 csv 文件数据。

谢谢,阿扬

【讨论】:

  • 嗨,感谢您的回复,我尝试了上述方法和其他一些方法,但我得到 NULL 值作为输出。
  • 您是否有机会提供一些示例文件,以便我可以编写代码来满足您的目的?
猜你喜欢
  • 2016-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-19
  • 2021-04-29
  • 2014-02-14
  • 2021-11-29
相关资源
最近更新 更多