【发布时间】:2014-11-25 14:54:21
【问题描述】:
我遇到了一个问题,将嵌套的 sapply 粘贴代码包装到 ifelse() 中,检查所有组件是否都是非 NA。当 sapplys 不在 ifelse() 中时,它们工作得很好……这是为什么呢?
给定一些参数:
a = c(1, 2, 3)
b = c("a", "b")
c = c("X", "Y")
这是我设法将所有组合粘贴在一起的方法
as.vector(sapply(sapply(a, function(x){paste(x, b, sep = "")}),
function(x){paste(x, c, sep = "")}))
输出是这样的。这正是我想要的:
[1] "1aX" "1aY" "1bX" "1bY" "2aX" "2aY" "2bX" "2bY" "3aX" "3aY" "3bX" "3bY"
但是,如果我将 完全相同的代码放入 ifelse() 中,以确保参数不是 NA,则输出会有所不同。
ifelse(!is.na(a) & !is.na(b) & !is.na(c),
as.vector(sapply(sapply(a, function(x){paste(x, b, sep = "")}),
function(x){paste(x, c, sep = "")})), "Error")
[1] "1aX" "1aY" "1bX"
Warning messages:
1: In !is.na(a) & !is.na(b) :
longer object length is not a multiple of shorter object length
2: In !is.na(a) & !is.na(b) & !is.na(c) :
longer object length is not a multiple of shorter object length
为什么?很明显,a、b、c 是不同的长度;我不明白为什么这在 ifelse() 中很重要。澄清一下, !is.na() 正在检查 whole vector 是否为 NA,而不是像 c(1, NA, 3) 这样的东西,因为我将在永远不会发生的上下文。我这样做是因为 ifelse 是较大函数的一部分,其中参数默认为 NA;非 NA 参数的某些组合需要某些操作。例如,如果 b = NA,那么上面的代码应该会产生一个错误。如何同时完成嵌套粘贴和条件检查?
【问题讨论】:
-
这不有什么关系?您在那里使用
&....您是否可能正在寻找any与您的is.na一起使用? -
"如果 a 不是 NA,b 不是 NA,c 不是 NA,则像这样粘贴在一起。否则,给出错误。"在我较大的函数中默认为 a、b 和 c,默认为 NA。因此,如果用户不提供 a、b 或 c 的替代值,则 !is.na(a) = FALSE
-
请在至少一个
NA的一个或多个向量中提供至少一个值,并显示您对sapply调用的期望输出。 -
请注意
NA适用于向量的元素,而不是向量本身。is.na函数检查向量的每个元素是否为NA。另一方面,对象可以是NULL。也许您应该将您的对象初始化为NULL而不是NA(并使用is.null函数)。
标签: r if-statement sapply