我有以下代码来打印完整的案例:
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的方法。让我们忽略所需输出的每一行中的##。提前谢谢。
答案 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)
}
如果这不起作用,您可能需要检查您的功能formatC
和complete.cases
。
编辑:
您的代码中存在多个冗余以及两个逻辑错误。 首先,您不需要初始化R中的对象以便为它们赋值。我删除了这两个
data<-NULL
dat <- NULL
并将第三个更改为空向量。其次,您可以看到我删除了dat
和data
对象的索引,并为其提供了更具表现力的名称。由于这两个对象是在for-loop
的每次迭代中新创建的,因此为它们提供索引是没有意义的。最后,你错放了结束括号(如上所述)并仅从dat$nobs
的一个元素(即最后一个)创建了s
:
dat <- data.frame(cbind(id,nobs=s[i]))
将其修复为
dat <- data.frame(cbind(id,nobs=s))
做了这个伎俩。
请考虑阅读一本关于(R-)编程的优秀初学者书籍,以便更好地理解控制结构。