如何在R语言中检查数据列中的NaN值?

5

我是Python用户,正在学习R。

经常需要检查数据框列中是否包含NaN。

在Python中,我可以简单地执行以下操作:

import pandas as pd
df = pd.DataFrame({'colA': [1,   2,   None, 3], 
                   'colB': ['A', 'B', 'C', 'D']})
df.isna().any()

给我
colA   True
colB   False
dtype: bool

我在R中遇到了困难,找不到一个简单的解决方案。人们提到了一些类似于"apply"的方法,但对于这样一个基本的任务来说,似乎过于复杂。我找到的最接近的解决方案是这个:

library(tidyverse)
df = data.frame(colA = c(1, 2, NA, 3), colB = c('A', 'B', 'C', 'D'))
!complete.cases(t(df))

提供

[1] TRUE   FALSE

这还好,但我看不到列名。如果数据框有50个列,我就不知道哪个有NaN值。

有更好的R解决方案吗?


2
应用类函数有什么问题? - RSale
2
NANaN之间有区别。 - Hong Ooi
如果您需要将此检查作为函数的一部分,请尝试使用 vapplyvapply(df, anyNA, FUN.VALUE = logical(1))FUN.VALUE 指定您期望的结果 - 在这里是每列长度为 1 的逻辑向量。 - markus
3个回答

6
您可以使用 anyNA() 函数:用于在向量中检查缺失值。
df = data.frame(colA = c(1, 2, NA, 3), colB = c('A', 'B', 'C', 'D'))
sapply(df, anyNA)

colA  colB 
TRUE FALSE 

编辑

jay.sf 是正确的。这将检查 NaN。

df = data.frame(colA = c(1, 2, NA, 3), colB = c('A', 'B', 'C', 'D'))

anyNAN <- function(x) {
  any(is.nan(x))
}

sapply(df, anyNAN)

2
不知道任何NA,好的,+1 - GuedesBF
等同于 apply(df, 2, anyNA) - Maël
1
由于要求涉及到“NaN”,因此一个答案应该简要地解释一下,例如is.nan(NA)is.na(NaN) - jay.sf
2
@Maël;在这种情况下,是的,但最好不要在数据框上使用apply,因为它会强制转换为矩阵,如果数据中有任何因子或字符列,这显然是一个问题。 - user20650
非常感谢。我之前也不知道有anyNA这个函数。我查找的其他参考资料中没有提到过这个函数。 - user2743931

4

检查列中是否存在NA值的最佳方法是对列应用循环和一个检查是否有any(is.na)的函数。

lapply(df, function(x) any(is.na(x)))

$colA
[1] TRUE

$colB
[1] FALSE

我看到你加载了tidyverse,但在示例中没有使用它。如果我们想要在tidyverse中完成这个任务,可以使用purrr:

library(purrr)

df %>% map(~any(is.na(.x)))

或使用dplyr:

library(dplyr)

df %>% summarise(across(everything(), ~any(is.na(.x))))

  colA  colB
1 TRUE FALSE

dplyr的解决方案缺少几个闭括号 - df %>% summarise(across(everything(), ~any(is.na(.x)))) - CallumH
感谢CallumH提供支持。已纠正错误。 - GuedesBF

1
最简单的方法是:
df = data.frame(colA = c(1, 2, NA, 3), colB = c('A', 'B', 'C', 'D'))

is.na(df)

输出:

      colA  colB
[1,] FALSE FALSE
[2,] FALSE FALSE
[3,]  TRUE FALSE
[4,] FALSE FALSE

更新,如果您只想查看包含NA的行:

> df[rowSums(is.na(df)) > 0,]

  colA colB
3   NA    C

更新2,或者只获取具有关于NA信息的ColNames(感谢RSale提供的anyNA):

> lapply(df, anyNA)
$colA
[1] TRUE

$colB
[1] FALSE

1
不知道 anyNA,不错,加一 - GuedesBF
从RSales的答案中得到了anyNA,但我更喜欢使用lapply。所以请也给他点赞 :-) - Marco_CH
1
哦,我明白了。我也这么做过。 - GuedesBF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接