[英]Dynamically creating data.frame with the variable which gets change in the for loop
我有一个名为“ specdata”的目录,其中包含csv文件(例如001.csv,002.csv,...,332.csv)。 现在,我希望函数读取该目录中的所有文件并返回一个data.frame,其中第一列是文件名,第二列是完整案例数。
例如:
id nobs
1 108
2 345
...
etc
现在,我编写了此函数,该函数读取“ specdata”目录中的所有文件,并在每个文件中生成完整案例的总和。 但是我不知道如何把每一个都不行。 由“ nobs”从循环生成的格式如下:
id nobs
1 108
2 345
...
...
332 16
我的功能:
complete <- function(directory, id = 1:332) {
for(i in 1:332)
{
if(i<10)
{
path<-paste(directory,"/00",id[i],".csv",sep="")
}
if(i>9 & i<100)
{
path<-paste(directory,"/0",id[i],".csv",sep="")
}
if(i>99 & i<333)
{
path<-paste(directory,"/",id[i],".csv",sep="")
}
mydata<-read.csv(path)
#nobs<-nrow(na.omit(mydata))
nobs<-sum(complete.cases(mydata))
}
}
问题是“点”在for循环中逐行动态创建,我想将所有文件的“点”的整个列表放入data.frame中。 我尝试了很多方法,但是无法将“ nobs”的整个列表与“ id”数字一起放入data.frame中。
有人可以建议一种以请求的顺序返回data.frame的方法吗?
建立所有nobs
值列表的最简单方法是这样的:
complete <- function(directory, id = 1:332) {
# Create an empty vector outside the for loop
nobs_vector <- c()
for(i in 1:332)
{
if(i<10)
{
path<-paste(directory,"/00",id[i],".csv",sep="")
}
if(i>9 & i<100)
{
path<-paste(directory,"/0",id[i],".csv",sep="")
}
if(i>99 & i<333)
{
path<-paste(directory,"/",id[i],".csv",sep="")
}
mydata<-read.csv(path)
#nobs<-nrow(na.omit(mydata))
nobs<-sum(complete.cases(mydata))
# Add the value to the end of the vector
nobs_vector <- c(nobs_vector, nobs)
}
# Take a look at the final vector you end up with
print(nobs_vector)
}
不一定那么优雅或有效,但是确实可以在for循环完成后以持久的形式获取这些值。 如果您想以类似的方式建立数据框,请查看?rbind
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.