[英]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.