我是新手编程并尝试在删除NA值后计算文件中的行数。该函数应返回一个数据框,其中第一列是文件的名称,第二列是完整案例的数量。
这是我的代码:
complete <- function(directory, id = 1:332){
setwd(directory)
df <- data.frame()
for (i in seq_along(id)){
if (id[i] < 10){
file_name <- paste("00",id[i],".csv", sep = "")
}
else if (id[i] >= 10 & id[i] < 100){
file_name <- paste("0",id[i],".csv", sep = "")
}
else{
file_name <- paste(id[i],".csv", sep = "")
}
file <- read.csv(as.character(file_name))
newfile <- na.omit(file)
#print(newfile)
df <- data.frame(id = id, nobs = nrow(newfile))
}
print(df)
}
当我像这样传递1:3的向量时:完成(“specdata”,1:3)我得到以下输出:
id nobs
1 243
2 243
3 243
其中id是列出1到332的文件的文件数,而nobs等于完整案例的数量。
似乎它正在我的数据框中的最后一项并重复每个id,我不知道如何解决它。我被编程逻辑绊倒了,就像这是一个初学者。此外,我看到了这个问题的一些其他解决方案,但他们使用的是完整的。我不明白如何申请。因此,数据框中的每个id都应该有自己的完整案例数(数据框中的nobs列)。
答案 0 :(得分:1)
这是一个需要研究的缩短版本。请注意,由于文件已按顺序排列,因此我不必显式paste
零。单独尝试list.files(path="specdata", full.names=TRUE)
以查看该功能的作用:
complete <- function(directory, id=1:332) {
lst <- sapply(id, function(x) {
df <- read.csv(list.files(path=directory, full.names=TRUE, pattern="csv")[x])
sum(complete.cases(df))
})
data.frame(id,nobs=unlist(lst))
}
修改强>
na.omit
和complete.cases
之间的区别是:
#Example
#Create data.frame with an NA value
df <- head(iris,3)
df[1,1] <- NA
df
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 NA 3.5 1.4 0.2 setosa
# 2 4.9 3.0 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
#'na.omit' will return a data.frame with non-NA rows:
na.omit(df)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 2 4.9 3.0 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
#'complete.cases' gives TRUEs and FALSEs for the rows with NAs
complete.cases(df)
#[1] FALSE TRUE TRUE
我使用&#39; complete.cases&#39;因为我只想要非NA行的总数。我不需要data.frame本身,这就是&#39; na.omit&#39;给出。
我可以加上TRUE和FALSE来获得sum(complete.cases(df))
的总数。该计划将知道将每个TRUE
变为1
,将每个FALSE
变为0
。
答案 1 :(得分:0)
您必须在代码中进行一些更改... 首先,在循环开始之前,在完整范围内定义data.frame。
df <- data.frame(id = id, nobs = NA)
第二,在您创建newfile
之后,将df <- data.frame...
指令替换为:
df[i,2] <- nrow(newfile)