在计算NAs,NAN和Inf时的奇怪行为

时间:2017-05-09 12:04:24

标签: r date dataframe nan tibble

我写了一个小函数,它将计算NA,NaN和一个信息数据帧中的Inf的数量,如下所示:

check.for.missing.values <- function(df) {
     return(  sum(is.na(as.matrix(df)) & !is.nan(as.matrix(df))) +    #NAs
              sum(is.infinite(as.matrix(df))) +                       #Infs
              sum(is.nan(as.matrix(df)))                              #NaNs
)}

我用下面的tibble测试了它:

x1 <- tibble(x = 1:7, 
             y = c(NA,NA,Inf,Inf,Inf,-Inf,-Inf), 
             z = c(-Inf,-Inf,NaN,NaN,NaN,NaN,NaN))
x1
# A tibble: 7 × 3
  x     y     z
<int> <dbl> <dbl>
  1     1    NA  -Inf
  2     2    NA  -Inf
  3     3   Inf   NaN
  4     4   Inf   NaN
  5     5   Inf   NaN
  6     6  -Inf   NaN
  7     7  -Inf   NaN`

我得到了

check.for.missing.values(x1)
[1] 14

当然是正确答案。

现在,如果我传递给函数的tibble恰好包含日期格式的观察,那么函数就会停止工作,我无法找出原因:

x2 <- mutate(x1, date = as.Date('01/07/2008','%d/%m/%Y'))
x2

# A tibble: 7 × 4
  x     y     z       date
<int> <dbl> <dbl>     <date>
  1     1    NA  -Inf 2008-07-01
  2     2    NA  -Inf 2008-07-01
  3     3   Inf   NaN 2008-07-01
  4     4   Inf   NaN 2008-07-01
  5     5   Inf   NaN 2008-07-01
  6     6  -Inf   NaN 2008-07-01
  7     7  -Inf   NaN 2008-07-01`

check.for.missing.values(x2)
[1] 7

有关正在发生的事情的任何线索?

由于

reyemarr

1 个答案:

答案 0 :(得分:3)

正如@nicola所提到的,您的问题在于您将数据框转换为矩阵。这样做,你强迫每个&#34;单元&#34;强迫一个班级,在这种情况下最终成为&#34;字符&#34;类,您的Inf-Inf不再被您的函数捕获。

您可以通过apply覆盖数据框中的列,在不借助矩阵转换的情况下执行您尝试执行的操作。在您的情况下,sapply将起作用。

check.for.missing.values <- function(df) {
    sum( sapply( df, function(x) {
        sum( { is.na(x) & !is.nan(x) } |
                 is.infinite(x) |
                 is.nan(x) )
    } ) )
}

sapply遍历每一列,将所有匹配给定条件的匹配项相加。返回一个数字向量,然后再次sum d得到总数。

check.for.missing.values(x2)
[1] 14