Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R中读取和命名不同的CSV文件_R_Csv - Fatal编程技术网

如何在R中读取和命名不同的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

我想对几个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="")))
}
使用“我的代码”,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()