【问题标题】:Getting NA/NaN error message in R but no missing values在 R 中获取 NA/NaN 错误消息但没有缺失值
【发布时间】:2021-09-25 16:21:30
【问题描述】:

我正在尝试编写一个函数来计算列表中每个新值的惊喜。这是一个虚拟示例:

x <- c('A','A','C','D','A','A','D','A','B','A','A')

surprise <- function(x){
  sur <-c()
  for (i in x){
    num <- sum(x[1:i] == x[i])
    denom <- length(x[1:i])
    sur[i] <- -log2((num)/(denom-1+4))
  }}

我的 for 循环产生了这个错误,即使我手动为 i 插入值,一切似乎都正常:

1:i 中的错误:NA/NaN 参数 另外:警告信息: 在 1:i 中:强制引入的 NAs

我也知道可能有一种方法可以在没有 for 循环的情况下编写这个 - 欢迎任何建议!

【问题讨论】:

  • 试试for (i in seq_along(x))。否则,您将遍历 x 的元素,这些元素是字符。另外添加 return(sur) 或简单地 sur 作为函数的最后一行以返回计算值。
  • 非常感谢! (仅供未来读者参考:length(x) 在这里不起作用(我尝试过的另一个修复方法),但 seq_along(x) 可以)

标签: r for-loop na


【解决方案1】:

修复你的循环

正如@stefan 指出的那样,错误是由循环 x 的元素引起的,而不是它们的索引。为了解决这个问题,您的代码可以改写为以下内容:

x <- c('A','A','C','D','A','A','D','A','B','A','A')

surprise <- function(x){
  sur <-c()
    for (i in 1:length(x)){
      num <- sum(x[1:i] == x[i])
      denom <- length(x[1:i])
      sur[i] <- -log2((num)/(denom-1+4))
    }
  return(sur)
}

surprise(x)

输出:

 [1] 2.000000 1.321928 2.584963 2.807355 1.415037 1.169925 2.321928 1.137504 3.584963 1.115477 1.000000

循环的替代方案

正如您在问题中提到的,您也可以通过几种方式编写此代码而无需循环。以下是来自{purrr} 的使用map_dbl 的一些建议。

无循环选项 1

您可以改写您的函数来计算x 中每个元素的相对位置,一次计算一个,而不是一次计算所有元素。通过将i 设为参数来做到这一点,如下所示。然后,您可以使用map_dbl 将此函数应用于x 中的每个i

library(purrr)

surprise <- function(x, i) {
  num <- sum(x[1:i] == x[i])
  denom <- length(x[1:i])
  return(-log2(num/(denom-1+4)))
}

map_dbl(1:length(x), ~ surprise(x, .))

无循环选项 2

或者,您可以废弃用户定义的函数并在map_dbl 中进行整个计算。这有点可读性差,但在一行中给出了与循环函数相同的输出。

map_dbl(1:length(x), ~ -log2(sum(x[1:.] == x[.]) / (length(x[1:.]) - 1 + 4)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-09
    • 2011-10-22
    • 2020-11-13
    • 1970-01-01
    • 2016-11-10
    • 2019-10-15
    • 2013-01-15
    • 1970-01-01
    相关资源
    最近更新 更多