【问题标题】:Checking all columns in data frame for missing values in R检查数据框中的所有列是否存在 R 中的缺失值
【发布时间】:2021-03-11 05:14:24
【问题描述】:

我有一个数据框 books,我正在尝试遍历所有列,如果该列有任何缺失值,则返回类似 missing 的内容。

下面是我的代码。它返回缺少的元素。然后我检查TRUE 是否构成了这些元素中的任何一个,这表明这是一个缺失的元素。

这行得通。

但是,作为 R 的新手,我知道有更好的方法可以做到这一点,但我不知道。

for (col in colnames(books)) {
  bool <- is.na(books[[col]])
  if (TRUE %in% bool) {
    print("Missing")
  } else {
    print("Fine")

  }
}

【问题讨论】:

  • 如果只是为了识别具有 NA colSums(is.na(books)) &gt; 0 的列,或者如果您想选择具有的列。不适用books %&gt;% select(where(~ all(!is.na(.))))
  • @akrun 谢谢! colsums() 代码正是我所追求的
  • 相关:Find names of columns which contain missing values。只需跳过查找名称的额外步骤。

标签: r


【解决方案1】:

anyNA 函数就是为此而构建的。您可以使用sapply(books, anyNA) 将其应用于数据框的所有列。要计算NA 的值,akrun 对colSums(is.na(books)) 的建议很好。

【讨论】:

  • 非常感谢。我一直在使用rangemean 使用sapply 函数。但我不知道有一个anyNA 函数
  • 只是出于兴趣,sapply 可以通过指定列的名称在单个列上运行。例如,这不像我所期望的那样工作sapply(books$price, mean),但这确实sapply(books[,4], mean)。如果我们假设“价格”是第 4 列。
  • sapply 迭代 - 它对每一列应用一个函数。您可以遍历单个列,但您需要提供一个 1 列数据框,而不仅仅是一个向量。 books['price']books[, 'price', drop = FALSE] 将提供 1 列数据框,其中 books[['price']]books[, 'price']books$price 提取列并将其提供给您,而不是在数据框中....
  • 所以你可以使用sapply(books['price'], anyNA),但是在单个列上迭代没有任何意义——你最好直接在提取的列上调用函数:anyNA(books$price)
  • 好吧,我知道它现在是如何工作的了。是的anyNA(books$price) 现在我想起来会更有意义。感谢您的帮助。
【解决方案2】:

在逻辑 matrix 上使用 colSums 可以计算 TRUE 的数量(TRUE ->1 和 FALSE -> 0)。从那里,使用比较运算符 (&gt;) 创建一个逻辑向量

colSums(is.na(books)) > 0 

【讨论】:

    【解决方案3】:

    colSums answer by @akrun 非常高效。这是另一种实现您的目的

    seq(ncol(books)) %in% unique(which(is.na(books),arr.ind = TRUE)[,"col"])
    

    【讨论】:

      【解决方案4】:

      以下代码对我帮助很大。

      此函数将显示您的 df 的任何列中有多少缺失值

      p <- function(x) {sum(is.na(x))/length(x)*100}
      apply(df,2,p)
      

      这里:1.找到每个缺失值; 2、创建一个有缺失值的向量; 3. 从我的 df 中删除缺失值。

      which(!complete.cases(df)) 
      na_df <- which(!complete.cases(df)) 
      df1 <- df[-na_df,]
      

      在最后一行,我创建了一个具有完整值的新 df "df1"。

      一切顺利

      【讨论】:

      • 不要在数据框列上使用apply - 这是低效的,因为它首先将数据框转换为矩阵。 sapply(df, p)lapply(df, p) 优于 apply(df, 2, p)
      猜你喜欢
      • 1970-01-01
      • 2022-12-13
      • 2019-06-21
      • 2020-02-10
      • 2021-08-03
      • 2021-06-27
      • 2017-12-21
      • 2020-12-31
      • 2021-02-18
      相关资源
      最近更新 更多