0

I am trying to write a function to read files from a directory and then either print the head of the file or summary of the head of the file in R. My code is as below...

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)
}

When i use this function without summarize option it works fine as below....

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

But when i use the summary option then i getting the output with all quotes around the lines as below...

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  "

I don't want any of the quotes for the lines. I even tried converting this into df but doesn't work. Where am i doing wrong?

upendra
  • 2,141
  • 9
  • 39
  • 64
  • When `summarize = TRUE`, you are returning `summary()`. Then you are doing `head(summary())` which gives what you are getting. If you just asked for `data`, it would give you the summary of the csv, but you are asking for the head of the summary. Change `test1 <- summary(test)` to `print(summary(test))` and also need to `return(test)` – rawr Jan 19 '14 at 01:26
  • 11
    While you're at it, why don't you specify that this is homework? Then, go to Google and search for 'stackoverflow "getmonitor" R' and see what might come up.... – A5C1D2H2I1M1N2O1R2T1 Jan 19 '14 at 11:18

4 Answers4

3

I finally got what i wanted using the bits and pieces from the above all. Here is the final code. Thanks a ton for the help though. Much appreciated......

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)
    }
}
upendra
  • 2,141
  • 9
  • 39
  • 64
0

Your read.csv line can have a colClasses parameter, representing:

A vector of classes to be assumed for the columns

So perhaps specify your column types in that vector explicitly. Leave a comment if it doesn't sort you and I'll look into things further.

hd1
  • 33,938
  • 5
  • 80
  • 91
  • I tried adding "colClasses" but it messed up the entire result..`test <- read.csv(file = filename1, colClasses = "character")` – upendra Jan 19 '14 at 01:19
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)
}
}

run this and put this in your working directory. and your working directory must have the specdata folder in it. Hope that helps. !!

Koushik Saha
  • 673
  • 1
  • 10
  • 25
0

First of all I would get rid of the ugly if-else construct using formatC or sprintf.(see SO question).If you want to print the head of the file or the summary of the head of the file, you have to put this in your function :-) .

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)
}

As an example I just use a randomly selected csv-file in my data directory.

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

or if you want to get the summary of the head:

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   

Hope this helps. Be aware that your function only returns the summary/head of the file, so that you have to read-in the file again when you really want to do some work with it.(not very efficient, especially with large files )

Community
  • 1
  • 1
hvollmeier
  • 2,956
  • 1
  • 12
  • 17