传递NA的参数变量时,R炸弹中的求和函数会炸毁

时间:2018-07-07 22:16:25

标签: r function sum

我遇到一个以下问题:我要提取一个仅包含NA的向量,我想对此进行求和。但是系统将返回错误,而不是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))

2 个答案:

答案 0 :(得分: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

带有sum的函数na.rm = T的行为与传递矢量或单数字列数据帧时的预期方式相同。但是,当单逻辑列数据时,会出现此错误。框架传入。我们可以得出结论,当参数为数据框架且仅接受错误消息中所述的数字变量时,该函数将检查类型。您只需要调整代码就可以记住这种行为。

答案 1 :(得分:0)

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

再次感谢

Andrzej