我想在几个csv文件上进行一些比较,所以我写了这段代码来读取我拥有的不同csv文件:
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文件是这样的:
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正确地分隔所有文件,但是对于每个文件,它创建一个表,在开头添加更多的空间:
|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?或者只是一个基数?
答案 0 :(得分:1)
我建议使用data.table包 - 它更快,最后非空列,它将这些列转换为NA
(根据我的经验)。这是我为simialr任务编写的一些代码:
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
时,您始终可以根据类型进行排序/过滤。例如,如果您想为diffuse
和direct
制作Dataset158
vs datase222
,则可以执行以下操作:
ggplot(data = dat[type == 'Dataset158' | type == 'Dataset222'],
aes(x = Diffuse, y = Direct)) + geom_point()
希望这有帮助!
答案 1 :(得分:0)
您遇到问题,因为您的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个列名,并且逻辑上认为第一列是rownames。在这里,您可以应用我们提出的补丁@konradrudolph:
library(tibble)
df %>% rownames_to_column() %>% setNames(c(colnames(.)[-1], 'DROP')) %>% select(-DROP)
其中df
是来自csv的数据。但是像这样的补丁会导致意想不到的结果......最好能正确保存csv文件。