如何在R中读取和命名不同的CSV文件
我想对几个csv文件进行比较,因此我编写了以下代码来读取我拥有的不同csv文件:如何在R中读取和命名不同的CSV文件,r,csv,R,Csv,我想对几个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)), rea
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="")))
}
使用“我的代码”,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?或者只是一个基数?您遇到了问题,因为您的csv文件末尾有一个空白列。。。使数据以逗号结尾:
04/09/14 00:01:00,04/09/14 00:01:00,2.2212200E-003,5.797364E-004,0.000000E+000,1.641484E-003,
这使R认为您的数据由7列而不是6列组成。正确的解决方案是正确地重新保存所有csv文件。否则,R将看到7列,但只有6列名称,并且逻辑上将认为第一列是rownames。在这里,您可以应用我们提供的@konradrudolph补丁:
库(TIBLE)
df%%>%rownames\u to_column()%%>%setNames(c(colnames(.)[-1],'DROP'))%%>%select(-DROP)
其中,
df
是来自csv的数据。但是像这样的补丁会导致意想不到的结果。。。更好地正确保存csv文件。我建议使用data.table包-它速度更快,而且对于最后的非空列,它会将它们转换为NA(以我的经验)。下面是我为类似任务编写的一些代码:
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)
希望这有帮助R工作正常:由于尾随逗号,您的CSV文件包含比列标题更多的列。您可能需要考虑将这些文件读入列表中,而不是<代码>赋值< /代码>将它们提交到全局环境中。例如:
results他说标题被移了1。一个简单的修复方法是只运行names(df)@AmitKohli,这不起作用,首先必须将行名转换为列。使用TIBLE/dplyr,即df%>%rownames\u to\u column()%%>%setNames(c(colnames(.)[-1],'DROP'))%%>%select(-DROP)
。但是,修复错误的CSV文件似乎更干净。我喜欢你的dplyr方法,但我的解决方案中没有涉及行名?同意修复有缺陷的csv文件更干净。只是说这样可能更容易;)
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)
ggplot(data = dat[type == 'Dataset158' | type == 'Dataset222'],
aes(x = Diffuse, y = Direct)) + geom_point()