簡體   English   中英

從R中的目錄讀取文件的寫入功能

[英]writing function for reading files from a directory in R

我正在嘗試編寫一個函數來從目錄中讀取文件,然后在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,但不起作用。 我在哪里做錯了?

我終於從上面得到了我想要的點點滴滴。 這是最終代碼。 謝謝你的幫助。 非常感激......

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

您的read.csv行可以具有colClasses參數,該參數表示:

A vector of classes to be assumed for the columns

因此,也許在該向量中明確指定列類型。 如果它不能使您滿意,請發表評論,我會進一步調查。

# 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文件夾。 希望能有所幫助。 !!

首先我要擺脫使用formatC或sprintf的難看的if-else構造(請參閱SO問題 )。如果要打印文件的開頭或文件的開頭摘要,則必須將其放在在您的功能中:-)

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   

希望這可以幫助。 請注意,您的函數只會返回文件的摘要/頭,因此當您確實想對其進行一些處理時,您必須再次讀入該文件(效率不高,特別是對於大文件)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM