【问题标题】:Sum function in R bombs out when passing a parametrised variable of NA's当传递 NA 的参数化变量时,R 中的 Sum 函数会爆炸
【发布时间】:2018-07-07 22:16:25
【问题描述】:

我有以下问题,我正在提取一个只包含 NAs 的向量,我想总结一下。但系统返回错误而不是0。这是因为将参数变量传递给函数。

考虑一下这段代码:

ConsData 是一个具有 5 列和多行的 data.frame。 假设我们有变量/列 A B C D E; D 列只是NA

WorkSum <- function(var) {
  Sumer <- (sum(ConsData[VARIABLE], na.rm = TRUE))
}
WorkSum(D)

产生以下错误:

FUN(X[[i]], ...) 中的错误: 仅在具有所有数值变量的数据框上定义

但是,如果我不将这一行参数化并重写如下,一切正常。

 Sumer <- (sum(ConsData$D, na.rm = TRUE))

【问题讨论】:

  • VARIABLE 来自哪里?如果要提取向量,请使用双括号[[
  • 并确保您的函数实际返回Sumer
  • 符合@markus的评论,看看class(mtcars["mpg"])class(mtcars[["mpg"]])的区别。便利的$ 访问(mtcars$mpg)模仿了后者。单括号表示法允许多于一列,因此mtcars[c("mpg","cyl")] 返回一个 2 列框架;双括号表示法总是需要单列,不多也不少。

标签: r function sum


【解决方案1】:

让我们重现你的场景:

ConsData <- data.frame(
  A = c(1, 2, NA),
  D = replicate(3, NA)
)

如果你想保持相同的功能,你需要像@markus已经指出的那样修改它:

# making var and VARIBALE consistent and providing a return value
WorkSum <- function(var) {
  sum(ConsData[var], na.rm = TRUE)
}

在这种情况下,需要在字符串中使用列名:

WorkSum("A") # working fine
WorkSum("D") # producing the error mentioned in question

实际的问题是为什么是命令

sum(ConsData['A'], na.rm = TRUE)
sum(ConsData$D, na.rm = TRUE)

工作正常,但不是以下

sum(ConsData['D'], na.rm = TRUE)

您可以查看它们的结构以获得更好的想法:

str(ConsData['A']) # NA is in a variable of numeric type here
# 'data.frame': 3 obs. of  1 variable:
#  $ A: num  1 2 NA

str(ConsData$D) # plain vector
# logi [1:3] NA NA NA

str(ConsData['D']) # NAs are in a variable of logical type
# 'data.frame': 3 obs. of  1 variable:
#  $ D: logi  NA NA NA

sumna.rm = T 的函数在传入向量或单数字列数据帧时的行为方式与您期望的方式相同。但是,当传入单逻辑列数据帧时,它会出现此错误. 我们可以得出结论,该函数在参数为数据框时检查类型,并且只接受错误消息中所述的数字变量。您只需要调整您的代码,牢记这种行为,因为它是有意义的。

【讨论】:

    【解决方案2】:

    感谢您的回复和帮助。从这里我收集到,因为向量在“NA”上是满的,read.csv 会选择这个向量作为逻辑而不是数字,因为自动检测。我现在采用的解决方案是在数据上指定 colClasses,然后强制向量为数字并且一切正常。

    再次感谢

    安德烈

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-02
      • 2019-01-15
      • 2012-04-12
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 2013-09-16
      • 2020-10-21
      相关资源
      最近更新 更多