【问题标题】:Strange behavior while counting NAs, NANs and Inf's计算 NA、NAN 和 Inf 时的奇怪行为
【发布时间】:2017-10-07 17:40:27
【问题描述】:

我写了一个小函数来计算 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

关于发生了什么的任何线索?

谢谢

雷耶马尔

【问题讨论】:

  • 看看as.matrix(x2) 产生了什么,你就会明白发生了什么。

标签: r date dataframe nan tibble


【解决方案1】:

正如@nicola 提到的,您的问题在于您将数据框转换为矩阵。这样做时,您会强制每个“单元格”强制转换为单个类,在这种情况下最终成为“字符”类,并且您的 Inf-Inf 不再被您的函数捕获。

您可以通过applying 覆盖数据框中的列来完成您想做的事情,而无需借助矩阵转换。在您的情况下,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 遍历每一列,将匹配给定条件集的所有匹配项相加。返回一个数字向量,然后可以再次sumd 得到总数。

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

【讨论】:

  • 或者只是check.for.missing.values &lt;- function(df) { x &lt;- unlist(df) ; sum(c((is.na(x) &amp; !is.nan(x)), is.infinite(x), is.nan(x))) }
  • @ulfelder 很有趣,我认为unlist 会像as.matrix 一样强制转换为character,但它会转换为numericas.matrixunlist 之间有什么区别导致这种差异?
  • 是的,实际上,我只是在带有字符串的 tibble 上测试了我的版本,然后你又回到了原来的问题。我认为它适用于日期,因为它们可能被强制转换为数字,但否则unlist 将出现类似于as.matrix 的问题。所以sapply 是一个更强大的解决方案。
  • 是的。仍然对为什么 unlistas.matrix 将相同的数据帧强制到不同的类感兴趣。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 2021-12-14
  • 2011-11-23
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多