使用R

时间:2017-03-01 11:51:55

标签: r loops csv pdf ggplot2

我对R很陌生,遇到了一个我根据自己的知识/书籍/互联网无法解决的问题。

所以这就是问题所在:

我有60个csv文件,我想为此绘制散点图。 它们的格式都相同,所以我(理论上)应该能够通过一个很好的循环来解决这个问题。 这是我的代码:

library(tools)
library(ggplot2)
files = dir('~/Klima_hist_CPL/tillnov/ClimDatK1/*.csv')
for (Y in list.files(path = "~/Klima_hist_CPL/tillnov/ClimDatK1/",pattern =".csv", 
     all.files = FALSE, full.names = TRUE, recursive = FALSE,
     ignore.case = FALSE, include.dirs = FALSE, no.. = FALSE)){
 myData<-read.csv(Y)
 pdf("~/Klima_hist_CPL/tillnov/ClimDatK1/mypdf.pdf", width = 4, height = 4)   
 print(ggplot(data = myData, aes(ACTION_DATE, TEMP)) 
   + geom_point(aes(x = myData$ACTION_DATE, y = myData$TEMP_SET),colour=('blue')) 
   + geom_point(aes(x = myData$ACTION_DATE, y = myData$TEMP_MEASURED), colour=('red') ))
#newFilename <-paste(file_path_sans_ext(basename(Y)),".jpg")
#fp <-paste('~/Klima_hist_CPL/tillnov/ClimDatK1/',newFilename)
#writeJPEG(output,file=fp,append=FALSE)
 dev.off()
}

正如您所看到的,我尝试了一下并使用了以前任务中的代码片段。不幸的是,他们在合并时不会工作。

总结:

  • 多个CSV文件
  • 所有格式都相同
  • 每一个都应该绘制
  • 我不在乎这会产生一个pdf或60个

2 个答案:

答案 0 :(得分:2)

我会将所有数据读入一个大数据框架并使用构面来制作ggplot2中的所有图形。一些显示通用代码模式的伪代码:

library(dplyr)
list_of_dfs = lapply(list.files('path/to/files', pattern = '*csv'), 
    function(x) {
        dat = read.csv(x)
        dat$fname = x
        return(dat)
    })
one_big_df = list_of_dfs %>% bind_rows()
one_big_df %>% ggplot(aes(x = x, y = y)) + geom_point() + facet_wrap(~ fname)

然后可以使用ggsave;

保存图表
ggsave('plot.png', width = 16, height = 9)

答案 1 :(得分:0)

这对我有用(只是为那些在类似问题上挣扎的人提供帮助)

最重要的是追加full.names = T

到我的  files<-list.files(path = "~/Klima_hist_CPL/tillnov/ClimDatK1/", pattern = ".csv", full.names = T)

library(tools)
library(ggplot2)
files<-list.files(path = "~/Klima_hist_CPL/tillnov/ClimDatK1/", pattern = ".csv", full.names = T)
for (Y in files){
  myData<-read.csv(Y);
  fname <- basename(Y);
  fname <- substr(fname, 1, nchar(fname) - 4);
  pdf(
    sprintf("~/Klima_hist_CPL/tillnov/ClimDatK1/%s.pdf", fname), 
    width = 10, 
    height = 8
  );
  print(ggplot(data = myData, aes(ACTION_DATE, TEMP)) + 
      geom_point(aes(x = myData$ACTION_DATE, y = myData$TEMP_SET),colour=('blue')) + 
      geom_point(aes(x = myData$ACTION_DATE, y = myData$TEMP_MEASURED), colour=('red') ))
  dev.off() 
}