我正在尝试编写一个函数来从目录中读取文件,然后在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但不起作用。我在哪里做错了?
答案 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
希望这会有所帮助。请注意,您的函数只返回文件的摘要/头部,因此当您真的想要使用它时,您必须再次读入文件。(效率不高,特别是对于大文件)