R 解释;条件具有长度>;1“;来自'if'函数的警告
我有一个数组:R 解释;条件具有长度>;1“;来自'if'函数的警告,r,if-statement,R,If Statement,我有一个数组: a <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
a <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
如何更正该函数?如果需要,您可能需要
ifelse
:
a <- c(1,1,1,1,0,0,0,0,2,2)
ifelse(a>0,a/sum(a),1)
[1] 0.125 0.125 0.125 0.125 1.000 1.000 1.000 1.000
[9] 0.250 0.250
(a/sum(a))^(a>0)
a 0,a/和(a),1)
[1] 0.125 0.125 0.125 0.125 1.000 1.000 1.000 1.000
[9] 0.250 0.250
如果语句未矢量化。对于矢量化if语句,应使用ifelse
。在你的情况下,写就足够了
w <- function(a){
if (any(a>0)){
a/sum(a)
}
else 1
}
这取决于您想使用哪一个,因为第一个函数给出长度为1的输出向量(在else部分),而ifelse
给出长度等于a
的输出向量。这里有一个不使用ifelse
的简单方法:
a <- c(1,1,1,1,0,0,0,0,2,2)
ifelse(a>0,a/sum(a),1)
[1] 0.125 0.125 0.125 0.125 1.000 1.000 1.000 1.000
[9] 0.250 0.250
(a/sum(a))^(a>0)
例如:
a <- c(0, 1, 0, 0, 1, 1, 0, 1)
(a/sum(a))^(a>0)
[1] 1.00 0.25 1.00 1.00 0.25 0.25 1.00 0.25
a(0)
[1] 1.00 0.25 1.00 1.00 0.25 0.25 1.00 0.25
只是在整个讨论中添加了一点,说明为什么会出现这个警告(我以前不清楚)。得到这个结果的原因如前所述,是因为在这种情况下“a”是一个向量,不等式“a>0”产生另一个真向量和假向量(其中“a”是否大于0)
如果您想改为测试'a>0'的任何值,您可以使用函数-'any'或'all'
最好的我解决这个问题的方式是,当我尝试做一些类似的事情时,我定义了一个函数,它被数组调用,就像其他人指出的那样
你可以这样做,但是在这种情况下,它不如斯文的方法优雅
sapply(a, function(x) afunc(x))
afunc<-function(a){
if (a>0){
a/sum(a)
}
else 1
}
sapply(a,函数(x)afunc(x))
afunc0){
a/总数(a)
}
其他1
}
正常创建函数后使用lappy
函数
lapply(x="your input", fun="insert your function name")
lappy
提供了一个列表,因此使用unlist
函数将它们从函数中删除
unlist(lapply(a,w))
@user1723765你希望得到什么结果?所以基本上如果a[a>0],那么a/sum(a)应该被做,而不是a[a>0]/sum(a)其他数字的结果是0和.166667等等,但我仍然会在结尾处有整个向量是我刚刚实现的。谢谢你的实际向量是否只包含0和1?这比ifelse
快了大约7倍(在100000个元素数组上)。你能推荐一个关于这个^
操作符的简洁解释/文档吗(例如,它叫什么以及它是如何工作的)。最好是比文档更直接的东西…@森林生态学家操作符^
用于求幂。命令x^y
的意思是:x
提升到y
的幂次。代码2^3
将计算2*2*2
。为什么哦为什么,如果R-land中的所有东西都矢量化了…“如果”没有?警告:ifelse只使用解决方案中的元素,因为条件中有元素!它没有对此发出警告。例如ifelse(TRUE,1:5,5:1)
返回1
作为答案,而不是1:5
。ifelse(c(T,T),1:5,5:1)`returnsc(1,2)
等。请谨慎使用。您的意思是unlist
将其从列表中删除,而不是函数?是的,我的意思是,很抱歉键入错误
unlist(lapply(a,w))