编写从R中的目录中读取文件的函数

时间:2014-01-19 00:40:33

标签: r function

我正在尝试编写一个函数来从目录中读取文件,然后在R中打印文件的头部或文件头部的摘要。我的代码如下...

getmonitor <- function(id, directory, summarize = FALSE) {
    if(id>=1 && id<10) {
        te1 <- paste("00",id,sep="")
        #print(te1)
    } else if(id>10 && id<=99) {
        te1 <- paste("0",id,sep="")
        #print(te1)
    } else {
        te1 <- id
        #print(te1)
    }
filename = paste(directory, te1, sep = "/")
filename1 = paste(filename, "csv", sep = ".")
filename1
test <- read.csv(file = filename1)
    if(summarize==TRUE) {
        test1 <- summary(test)
    } else {
        test1 = test
    }
    return (test1)
}

当我使用此功能而没有汇总选项时,它可以正常工作....

data <- getmonitor(1, "specdata") 
> head(data) 
        Date sulfate nitrate ID
1 2003-01-01      NA      NA  1
2 2003-01-02      NA      NA  1
3 2003-01-03      NA      NA  1
4 2003-01-04      NA      NA  1
5 2003-01-05      NA      NA  1
6 2003-01-06      NA      NA  1

但是当我使用摘要选项时,我得到的输出中包含所有引号,如下所示......

data <- getmonitor(101, "specdata", TRUE) 
> head(data) 
         Date          sulfate            nitrate                ID       
 "2005-01-01:  1  " "Min.   : 1.700  " "Min.   : 0.2490  " "Min.   :101  "
 "2005-01-02:  1  " "1st Qu.: 3.062  " "1st Qu.: 0.6182  " "1st Qu.:101  "
 "2005-01-03:  1  " "Median : 4.345  " "Median : 1.0500  " "Median :101  "
 "2005-01-04:  1  " "Mean   : 6.267  " "Mean   : 2.2679  " "Mean   :101  "
 "2005-01-05:  1  " "3rd Qu.: 7.435  " "3rd Qu.: 2.7825  " "3rd Qu.:101  "
 "2005-01-06:  1  " "Max.   :22.100  " "Max.   :10.8000  " "Max.   :101  "

我不想要这些行的任何引号。我甚至尝试将其转换为df但不起作用。我在哪里做错了?

4 个答案:

答案 0 :(得分:2)

我终于得到了我想要的东西,使用了以上所有的点点滴滴。这是最终的代码。非常感谢你的帮助。非常感谢......

getmonitor <- function(id, directory, summarize = FALSE) {
    te1 <- formatC(id, width=3, flag="0")
    filename = paste(directory, te1, sep = "/")
    filename1 = paste(filename, "csv", sep = ".")
    test <- read.table(file = filename1, header=T, sep=",")
    if(summarize) {
        print(summary(test))
    return (test)
    } else {
    return (test)
    }
}

答案 1 :(得分:0)

您的read.csv行可以有一个colClasses参数,表示:

A vector of classes to be assumed for the columns

因此,可能明确指定该向量中的列类型。如果不对你进行排序,请发表评论,我会进一步研究。

答案 2 :(得分:0)

# Usage: getmonitor(12,"specdata",TRUE)
getmonitor <- function(id, directory, summarize = FALSE) {

l<-nchar(id)
if(l==1)
{
op<-paste(directory,"/","00",paste(id,".csv",sep=""),sep="")
data<-read.csv(op)
#print(class(data))
if(summarize == TRUE)
{
print(summary(data))
return(data)
}
else 
return(data)

}
if (l==2)
{
op<-paste(directory,"/","0",paste(id,".csv",sep=""),sep="")
data<-read.csv(op)
if(summarize == TRUE)
{
print(summary(data))
return(data)
}
else 
return(data)

}
if(l==3)
{
op<-paste(directory,"/",id,".csv",sep="")
data<-read.csv(op)
if(summarize == TRUE)
{
print(summary(data))
return(data)
}
else 
return(data)
}
}

运行此命令并将其放入您的工作目录中。并且您的工作目录中必须包含specdata文件夹。  希望有所帮助。 !!

答案 3 :(得分:0)

首先,我将使用formatC或sprintf摆脱丑陋的if-else结构。(参见SO question)。如果要打印文件的头部或文件头部的摘要,你必须把它放在你的功能:-)。

getmonitor <- function(id, directory, summarize = FALSE) {
  te1 <- formatC(id, width=4, flag="0")

  filename = paste(directory, te1, sep = "/")
  filename1 = paste(filename, "csv", sep = ".")
  filename1
  print(filename1)
  test <- read.csv(file = filename1)
  if(summarize==TRUE) {
    test1 <- summary(head(test))
  } else {
    test1 = head(test)
  }
  return (test1)
}

作为一个例子,我只是在我的数据目录中使用随机选择的csv文件。

getmonitor(22,"~/Data/R")

  term   vola    range
1   30 0.2129      max
2   30 0.1191 quartile
3   30 0.0944   median
4   30 0.0855 quartile
5   30 0.0714      min
6   60 0.1831      max

或者如果你想获得头部的摘要:

getmonitor(22,"~/Data/R",summarize=TRUE)

      term         vola              range  
 Min.   :30   Min.   :0.07140   max     :2  
 1st Qu.:30   1st Qu.:0.08772   median  :1  
 Median :30   Median :0.10675   min     :1  
 Mean   :35   Mean   :0.12773   quartile:2  
 3rd Qu.:30   3rd Qu.:0.16710               
 Max.   :60   Max.   :0.21290   

希望这会有所帮助。请注意,您的函数只返回文件的摘要/头部,因此当您真的想要使用它时,您必须再次读入文件。(效率不高,特别是对于大文件)