我正在完成一个R教程,并怀疑我必须使用其中一个功能,但我不确定哪个(是的,我研究了它们,但直到我在R术语上更流利,它们才是相当的混乱)。
在我的工作目录中有一个文件夹" specdata"。 Specdata包含数百个名为001.csv - 300.csv。
的CSV文件我正在处理的函数必须计算输入数量的csv文件的总行数。因此,如果函数中的参数为1:10
且每个文件都有十行,则返回100。
这是我到目前为止所拥有的:
complete <- function(directory,id = 1:332) {
setpath <- paste("/Users/gcameron/Desktop",directory,sep="/")
setwd(setpath)
csvfile <- sprintf("%03d.csv", id)
file <- read.csv(csvfile)
nrow(file)
}
当ID参数是一个数字(例如17)时,这是有效的。但是,如果我输入说10:50作为参数,我会收到错误:
Error in file(file, "rt") : invalid 'description' argument
如何计算输入ID参数的总行数?
答案 0 :(得分:9)
read.csv
期望只读取一个文件,因此您需要循环遍历文件,这样做的另一种方法是使用sapply
:
nrows <- sapply( csvfile, function(f) nrow(read.csv(f)) )
sum(nrows)
例如,这里是对complete
函数的重写:
complete <- function(directory,id = 1:332) {
csvfiles <- sprintf("/Users/gcameron/Desktop/%s/%03d.csv", directory, id)
nrows <- sapply( csvfiles, function(f) nrow(read.csv(f)) )
sum(nrows)
}
答案 1 :(得分:1)
家庭作业问题通常会被标记,但我不知道是否需要,但这显然是作业。
你写的函数期望id 不一个向量(尽管默认值是整数向量)。
将其更改为使用* apply函数之一(更简洁和常见),甚至是显式循环。对于id向量中的每个元素,您必须调用一个打开该文件的函数并对观察值进行计数。
This stackoverflow post很好地解释了* apply函数之间的差异。
答案 2 :(得分:0)
id <-c(1:332)
filenames=list.files(path="source_path", full.names=TRUE)
for(a in id){
dataset <- read.csv(filenames[a])
res <- nrow(na.exclude(dataset)) #nrow count the row of the dataset
df <-data.frame(
id =a,
nobs =res,
stringsAsFactors=FALSE)
}
df
答案 3 :(得分:0)
complete <- function(directory, id = 1:332){
mylist <- list.files(path = directory, pattern = ".csv")
result <- data.frame()
for(i in id){
my_data <- read.csv(paste(directory,mylist[i],sep=""))
res <- nrow(na.exclude(my_data)) #nrow count the row of the dataset
df <- data.frame("id" = i,"nobs" = res, stringsAsFactors=FALSE)
result <- rbind(result,df)
}
return(result)
}