尝试使用na.omit()删除NA后计算data.frame中的行数

时间:2016-01-31 02:47:37

标签: r

我是新手编程并尝试在删除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列)。

2 个答案:

答案 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.omitcomplete.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)