我想创建一个带有列名的空数据框,然后运行一个函数,该函数计算几个文件中没有丢失数据的行数,并存储数据框中的文件号和完整行数。该函数有两个参数,一个是文件存储(文件夹)的文件夹名称,另一个是我想访问的文件编号(id)
我有功能正常但最终数据框的格式出错了,任何人都可以建议我可能出错的地方以及如何纠正它以便以正确的格式出现。我的代码是:
complete<-function (directory, id = 1:332) {
data1<-data.frame(id=numeric(),nobs=numeric())
for (i in id) {
file_name<-sprintf("%03d.csv",i)
file_add<-paste0("C:/Users/Babbage/coursera/Computing for Data Analysis/assignments","/",directory)
file_to_read<-paste0(file_add,"/",file_name)
filedata<-read.csv(file_to_read)
x <- filedata[complete.cases(filedata), ]
count1<-nrow(x)
newrow<-c(i,count1)
data1<-rbind(c(data1,newrow))
}
print(data1)
}
如果我跑:
complete("specdata",c(2,4,8,10,12))
我明白了
[1] id nobs
<0 rows> (or 0-length row.names)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,] Numeric,0 Numeric,0 2 1041 4 474 8 192 10 148 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
关于如何使我的代码更好的建议的任何其他建议总是受到赞赏。
答案 0 :(得分:1)
在我看来,你应该在这里创建数据框而不是绑定值。在上面的代码中
newrow <- c(i, count1)
data1 <- rbind(c(data1, newrow))
newrow只是一个数字向量(即一组相同类型的值)必不可少的。 c()运算符以这种方式创建向量。当您将下一个组写入data1时,您在rbind语句中再次使用了c(),因此您只是延长了原始向量而没有创建新行(如您的输出示例所示)和rbind ()没有做你想要的。
示例:
newrow <- c(1,10)
newrow2 <- c(2,20)
c(newrow, newrow2)
rbind(newrow, newrow2)
注意c()和rbind()函数如何在上面工作的区别; c()将newrow2值添加到newrow的末尾,rbind创建第二行数据。您可以在rbind()函数中删除c()以获得所需的结果,但我更倾向于使用如下例所示的数据框:
newrow <- data.frame(id = i, nobs = count1)
data1 <- rbind(data1, newrow)
现在您的输出是一个数据框,其中有两列名为'id',另一列名为'nobs'