jemimah
各位大侠好
本人有一个关于R中导入和作图问题真心求教,目前我有若干个csv文件,每个文件中的数据格式固定,我想在R中同时导入这若干个文件中的某两列数据,然后用这两列数据作x,y图,应该如何操作呢?
现在的问题关键就是我有上百个csv文件(共100M左右),我想把这些csv中的数据合并后,一起作图,在R中可以做到吗?谢谢各位。
pengchy
先把你的所有的csv文件放入一个文件夹中,其路径假设为dir.csv
如果你的数据行数都一样,那么可以用data.frame,如果不一样可以用list,现在假设你所有数据的行数都一样:
<br />
csv.line <- "你csv文件的行数“<br />
cl.need <- c("你想要的列“)<br />
csv.df <- data.frame(rep(0,csv.line))<br />
for(i in dir(dir.csv)){<br />
file.i <- paste(dir.csv,"/",i,sep="")<br />
csv.i <- read.csv(file.i)[,cl.need]<br />
csv.df <- data.frame(csv.df,csv.i)<br />
}<br />
csv.df <- csv.df[,-1]<br />
jemimah
谢谢pengchy,先感谢你再说,然后再仔细看你的回复!
jemimah
pengchy,我按照你的代码拷贝到R 中后,得到如下一些提示,你帮我看看问题是处在哪里吗?另外我的每个csv文件中的数据行不一样,若用List的话,需要怎么做?谢谢。
> csv.line <- "2688"
> cl.need <- c("2,6")
> csv.df <- data.frame(rep(0,csv.line))
> for(i in dir(E:\\01-data\\RGA\\GCO0423.csv)){
错误: 意外的输入在"for(i in dir(E:\"里
> file.i <- paste(E:\\01-data\\RGA\\GCO0423.csv,"/",i,sep="")
错误: 意外的输入在"file.i <- paste(E:\"里
> csv.i <- read.csv(file.i)[,cl.need]
错误于read.table(file = file, header = header, sep = sep, quote = quote, :
找不到这个对象"file.i"
> csv.df <- data.frame(csv.df,csv.i)
错误于data.frame(csv.df, csv.i) : 找不到这个对象"csv.i"
> }
错误: 意外的'}'在"}"里
> csv.df <- csv.df[,-1]
yanlinlin82
使用 R 之前,请先学习一下基本语法,包括如何表示字符串等。
jemimah
恩 我确实应该从基础学起啊 不知道那里有培训班,因为我基本上没有编程方面的基础
yanlinlin82
培训班好像有一些,不过不知道效果如何。个人觉得主要还是靠自己多实践。
http://www.r-project.org/ 上的文档都是很不错的教材,网上也能找到相关中译版。另外bjt的《153 分钟学会 R》(
http://cos.name/cn/topic/7673)等,也都是很好的入门教程。
jemimah
谢谢yanlinlin,我回头仔细学习。老外也给了我一段程序,我贴在这里,能帮我看看吗?就是关于读入多个独立csv文件的,我不知道怎么用,哎,帮帮忙吧。
read.entire.tree = function(fpath, logfile=TRUE) {
# import all files in a directory recursively
if (logfile) {
if (grep("/$", fpath) != 1) {
fpath = paste(fpath, "/", sep="")
}
sink(file = paste(fpath, "R.log", sep=""))
}
flist = list.files(fpath, pattern = ".dat|.DAT|.met|.MET", recursive = TRUE)
Z = NULL
for (file in flist) {
X = readfile.campbell(paste(fpath, file,sep=""), verbose = TRUE)
Z = rbind(Z, X)
}
X = Z
Z$dtm = format(as.POSIXct(X$dtm, tz = "GMT"), tz = "GMT")
write.table(Z, file="C:/Documents and Settings/Zhoulx/桌面/CO-RGA data update-20090602/campbell.csv", sep=",", row.names=F)
if (logfile) {
sink()
}
return(NULL)
}
pengchy
我也觉得你先看看R-intro比较好,呵呵
jemimah
我会看得,但是因为这件事情太紧急了,我必须要先做完。
jemimah
我在r中试着运行了一下这段程序,提示错误为“错误于if (grep("/$", fpath) != 1) { : 变元长度为零”,不知道是什么意思?
我把我的数据放在附件中,请帮忙诊断一下吧,谢谢了。
> read.entire.tree = function(fpath, logfile=TRUE) {
+ # import all files in a directory recursively
+ if (logfile) {
+ if (grep("/$", fpath) != 1) {
+ fpath = paste(fpath, "/", sep="")
+ }
+ sink(file = paste(fpath, "R.log", sep=""))
+ }
+ flist = list.files(fpath, pattern = ".dat|.DAT|.met|.MET", recursive = TRUE)
+ Z = NULL
+ for (file in flist) {
+ X = readfile.campbell(paste(fpath, file,sep=""), verbose = TRUE)
+ Z = rbind(Z, X)
+ }
+ X = Z
+
+ Z$dtm = format(as.POSIXct(X$dtm, tz = "GMT"), tz = "GMT")
+ write.table(Z, file="C:/CO/campbell.csv", sep=",", row.names=F)
+ if (logfile) {
+ sink()
+ }
+ return(NULL)
+ }
>
>
> ## Example: Read single file and show wind rose
> # X = readfile.campbell(ffile=file.choose())
> # summary(X)
> # library(meteoconv)
> # f = wind.freq(X, plot=TRUE)
>
> ## Example: read entire tree
> fpath = "C:/CO"
> read.entire.tree(fpath, logfile=TRUE)
错误于if (grep("/$", fpath) != 1) { : 变元长度为零
yanlinlin82
意思就是即使有人给了你代码,你不尝试把R弄懂,还是很难正确使用起来的。
一般遇到错误,注意提示的信息,并不难分析找出原因。
下面贴几个语句的执行效果,供参考:
<br />
> if (NULL) cat("OK")<br />
Error in if (NULL) cat("OK") : argument is of length zero<br />
> if (TRUE) cat("OK")<br />
OK> if (TRUE) cat("OK\n")<br />
OK<br />
> if (FALSE) cat("OK\n")<br />
> if (c(TRUE, FALSE)) cat("OK\n")<br />
OK<br />
Warning message:<br />
In if (c(TRUE, FALSE)) cat("OK\n") :<br />
the condition has length > 1 and only the first element will be used<br />
我装的英文版,所以提示文字不是中文。不过第一句的错误与楼上的错误是一样的。
jemimah
谢谢,看来我要做的功课太多了,哎
pengchy
[align=justify]
<br />
dir.csv <- "d:/test/csv/" #指的是你csv文件所在文件夹的绝对路径,不是具体的文件名<br />
csv.line <- 100 #数字,不用加引号,比如100<br />
cl.need <- c(1,2)#同上,比如1,2<br />
csv.df <- data.frame(rep(0,csv.line))<br />
for(i in dir(dir.csv)){<br />
file.i <- paste(dir.csv,"/",i,sep="")<br />
csv.i <- read.csv(file.i)[,cl.need]<br />
csv.df <- data.frame(csv.df,csv.i)<br />
}<br />
csv.df <- csv.df[,-1]<br />
如果用list的话,可以这样:
<br />
dir.csv <- "d:/test/csv/" #指的是你csv文件所在文件夹的绝对路径,不是具体的文件名<br />
cl.need <- c(1,2)#同上,比如1,2<br />
csv.lst <- list()<br />
for(i in dir(dir.csv)){<br />
file.i <- paste(dir.csv,"/",i,sep="")<br />
csv.i <- read.csv(file.i)[,cl.need]<br />
csv.lst <- c(csv.lst,as.list.data.frame(csv.i))<br />
}<br />
真的很着急的话,就找个比较熟悉的人帮你做吧,呵呵,毕竟这个才是第一步,你下面接着还要做一些分析的。
jemimah
pengchy ,按照你的提示,我运行的结果如下,求救阿,又不明白了,其实这次我就是要把这些数据读入后再做个图,不涉及别的分析了,然后今后我一定会勤奋努力学习r的,谢谢,期待回复中。
> csv.df <- csv.df[,-1]
> dir.csv <- "C:/CO" #指的是你csv文件所在文件夹的绝对路径,不是具体的文件名
> csv.line <- 5000 #数字,不用加引号,比如100
> cl.need <- c(1,6) #同上,比如1,2
错误: 意外的输入在"cl.need <- c(1
> csv.lst <- list()
> for(i in dir(dir.csv)){
+ file.i <- paste(dir.csv,"/",i,sep="")
+ csv.i <- read.csv(file.i)[,cl.need]
+ csv.lst <- c(csv.lst,as.list.data.frame(csv.i))
+ }
错误于read.table(file = file, header = header, sep = sep, quote = quote, :
no lines available in input
> csv.df <- csv.df[,-1]
pengchy
不好意思,上面的逗号是中文的,改过来再试试?
c(1,2)
jemimah
谢谢各位阿,昨天折腾到今天,总算把数据读入了,哈哈,没出现错误,现在有两个问题,1、我想把读入的数据output出来,如何做?2、怎样用这些读入的数据的plot(x,y)呢?
jemimah
奇怪了,我重新运行一次,又出现提示:错误: 找不到这个对象"csv.df",如下,为什么呢?
> csv.df <- csv.df[,-1]
错误: 找不到这个对象"csv.df"
> dir.csv <- "C:/CO" #指的是你csv文件所在文件夹的绝对路径,不是具体的文件名
> csv.line <- 5000 #数字,不用加引号,比如100
> cl.need <- c(1, 6) #同上,比如1,2
> csv.lst <- list()
> for(i in dir(dir.csv)){
+ file.i <- paste(dir.csv,"/",i,sep="")
+ csv.i <- read.csv(file.i)[,cl.need]
+ csv.lst <- c(csv.lst,as.list.data.frame(csv.i))
+ }
> csv.df <- csv.df[,-1]
错误: 找不到这个对象"csv.df"
pengchy
最后那行没用,呵呵,你直接看csv.lst对象,看看是不是已经是你想要的结果了。csv.lst[[1]]
jemimah
恩 我已经看到我要的结果了,然后如何将这些数据作图呢?把第一列作为x轴,第二列作为y轴?谢谢啦