如何在R中读取和命名不同的CSV文件

How to read and name different CSV files in R

我想对几个csv文件进行比较,所以我写了这个代码来读取我拥有的不同csv文件:

1
2
3
4
5
6
7
8
9
path <-"C:\\data\"
files <- list.files(path=path, pattern="*.csv")
for(file in files)
{
  perpos <- which(strsplit(file,"")[[1]]==".")
  assign(
    gsub("","",substr(file, 1, perpos-1)),
    read.csv(paste(path,file,sep="")))
}

我的csv文件是这样的:

1
2
3
4
5
Start Time,End Time,Total,Diffuse,Direct,Reflected
04/09/14 00:01:00,04/09/14 00:01:00,2.221220E-003,5.797364E-004,0.000000E+000,1.641484E-003,
04/09/14 00:02:00,04/09/14 00:02:00,2.221220E-003,5.797364E-004,0.000000E+000,1.641484E-003,
04/09/14 00:03:00,04/09/14 00:03:00,2.221220E-003,5.797364E-004,0.000000E+000,1.641484E-003,
(...)

使用我的代码,r正确地分隔所有文件,但对于每个文件,它都会创建一个表,在开头添加更多的额外空间:

1
2
3
                 |Start Time       |End Time     |Total        |Diffuse      |Direct       |Reflected
04/09/14 00:01:00|04/09/14 00:01:00|2.221220E-003|5.797364E-004|0.000000E+000|1.641484E-003|NA
...

我怎么修?

此外,考虑到每个文件的原始名称非常长,是否可以使用文件的最后一个字母命名每个data.frame?或者只是一个基数?


我建议使用data.table包——它更快,而且对于最后的非空列,它将这些列转换为EDOCX1(以我的经验为例)。下面是我为一个类似的任务编写的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
read_func <- function(z) {
  dat <- fread(z, stringsAsFactors = FALSE)
  names(dat) <- c("start_time","end_time","Total","Diffuse","Direct","Reflect")
  dat$start_tme <- as.POSIXct(strptime(dat$start_tme,
                    format ="%d/%m/%y %H:%M:%S"), tz ="Pacific/Easter")
  patrn <-"([0-9][0-9][0-9])\\.csv"
  dat$type <- paste("Dataset",gsub(".csv","", regmatches(z,regexpr(patrn, z))),sep="")
  return(as.data.table(dat))
}

path <-".//Data/"
file_list <- dir(path, pattern ="csv")
file_names <- unname(sapply(file_list, function(x) paste(path, x, sep ="")))
data_list <- lapply(file_names, read_func)

dat <- rbindlist(data_list, use.names = TRUE)

rm(path, file_list, file_names)

这将为您提供一个列表,其中每个项目都是来自相应文件名的data.table。我假设所有的文件名在扩展名之前都有一个三位数,我用来给每个data.table分配一个变量type。您可以更改patrn以匹配您的特定用例。这样,当您将所有数据合并到一个data.table dat中时,您总是可以根据类型进行排序/筛选。例如,如果您想为Dataset158datase222绘制diffusedirect,可以执行以下操作:

1
2
ggplot(data = dat[type == 'Dataset158' | type == 'Dataset222'],
       aes(x = Diffuse, y = Direct)) + geom_point()

希望这有帮助!


您有问题,因为您的csv文件末尾有一个空白列…使数据以逗号结尾:

04/09/14 00:01:00,04/09/14 00:01:00,2.221220E-003,5.797364E-004,0.000000E+000,1.641484E-003,

这使R认为您的数据由7列而不是6列组成。正确的解决方案是正确地重新保存所有csv文件。否则,R将看到7列,但只有6列名称,并且逻辑上认为第一列是行名称。您可以在这里应用我们提供的补丁@konradrudolph:

library(tibble)
df %>% rownames_to_column() %>% setNames(c(colnames(.)[-1], 'DROP')) %>% select(-DROP)

其中,df是csv的数据。但是像这样的补丁会导致意想不到的结果…最好正确保存csv文件。