R中的函数确定完整的案例

时间:2014-08-10 18:58:40

标签: r function nested-loops

我有以下代码来打印完整的案例:

complete <- function(directory, id=1:332) {
data<-NULL
dat <- NULL
s <- NULL
   for (i in 1:length(id)) {
data[[i]]<- c(paste(directory, "/",formatC(id[i], width=3, flag=0),".csv",sep=""))   
df[[i]]<-c(read.csv(data[[i]])) 
s[i] <- sum(complete.cases(df[[i]]))
dat <- data.frame(cbind(id,nobs=s[i]))    
   } 
dat
}

我得到的输出如下:

complete("specdata", c(2, 4, 8, 10, 12))
  id nobs  
1  2   96
2  4   96
3  8   96
4 10   96
5 12   96

所需的输出如下所示:

complete("specdata", c(2, 4, 8, 10, 12))
##   id nobs
## 1  2 1041
## 2  4  474
## 3  8  192
## 4 10  148
## 5 12   96

.csv看起来像这样:

head(file)
        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

从2个输出可以看出,所有id的nobs值都是对应于id == 12的复制值。我无法找到输出与id对应的nobs的方法。让我们忽略所需输出的每一行中的##。提前谢谢。

1 个答案:

答案 0 :(得分:1)

我试图清理你的代码:

complete <- function(directory, id) {
  s <- vector()
  for (i in 1:length(id)) {
      path <- c(paste(directory, "/",formatC(id[i], width=3, flag=0),".csv",sep=""))   
      data <- c(read.csv(path)) 
      s[i] <- sum(complete.cases(data))
  } 
  dat <- data.frame(cbind(id,nobs=s))   
  return(dat)
 }

如果这不起作用,您可能需要检查您的功能formatCcomplete.cases

编辑:

您的代码中存在多个冗余以及两个逻辑错误。 首先,您不需要初始化R中的对象以便为它们赋值。我删除了这两个

data<-NULL
dat <- NULL

并将第三个更改为空向量。其次,您可以看到我删除了datdata对象的索引,并为其提供了更具表现力的名称。由于这两个对象是在for-loop的每次迭代中新创建的,因此为它们提供索引是没有意义的。最后,你错放了结束括号(如上所述)并仅从dat$nobs的一个元素(即最后一个)创建了s

dat <- data.frame(cbind(id,nobs=s[i])) 

将其修复为

dat <- data.frame(cbind(id,nobs=s)) 

做了这个伎俩。

请考虑阅读一本关于(R-)编程的优秀初学者书籍,以便更好地理解控制结构。