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)`returns
c(1,2)
等。请谨慎使用。您的意思是
unlist
将其从列表中删除,而不是函数?是的,我的意思是,很抱歉键入错误
unlist(lapply(a,w))