代码之家  ›  专栏  ›  技术社区  ›  user2743931

检查列(R)中NaN的最简单方法是什么?

  •  2
  • user2743931  · 技术社区  · 3 年前

    我是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中,我正在努力寻找一个简单的解决方案。人们提到了一些类似应用程序的方法,但对于这样一个原始的任务来说,这似乎过于复杂。我找到的最接近的解决方案是:

    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解决方案吗?

    3 回复  |  直到 3 年前
        1
  •  6
  •   RSale    3 年前

    您可以使用anyNA:检查矢量中的NA

    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
  •  4
  •   GuedesBF    2 年前

    检查列是否有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
    
        3
  •  1
  •   Marco_CH    3 年前

    最简单的方法是:

    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