我遇到一个以下问题:我要提取一个仅包含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))
答案 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