我有一个数组:
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)
Run Code Online (Sandbox Code Playgroud)
并希望实现以下功能:
w<-function(a){
if (a>0){
a/sum(a)
}
else 1
}
Run Code Online (Sandbox Code Playgroud)
此函数要检查是否存在a
大于0的任何值,如果是,则将每个元素除以总和的总和.
否则它应该只记录1.
我收到以下警告消息:
Warning message:
In if (a > 0) { :
the condition has length > 1 and only the first element will be used
Run Code Online (Sandbox Code Playgroud)
我该如何纠正这个功能?
use*_*1_G 53
也许你想要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
Run Code Online (Sandbox Code Playgroud)
jem*_*bfp 39
if
声明没有矢量化.对于你应该使用的矢量化if语句ifelse
.在你的情况下,写作就足够了
w <- function(a){
if (any(a>0)){
a/sum(a)
}
else 1
}
Run Code Online (Sandbox Code Playgroud)
或简短的矢量化版本
ifelse(a > 0, a/sum(a), 1)
Run Code Online (Sandbox Code Playgroud)
这取决于你想要使用哪个,因为第一个函数给出长度为1的输出向量(在其他部分),并ifelse
给出长度等于长度的输出向量a
.
Sve*_*ein 17
这是一个简单的方法ifelse
:
(a/sum(a))^(a>0)
Run Code Online (Sandbox Code Playgroud)
一个例子:
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
Run Code Online (Sandbox Code Playgroud)
小智 14
只是在整个讨论中添加一个观点,说明为什么会出现这个警告(之前我不清楚).之所以如前所述是因为在这种情况下'a'是向量而不等式'a> 0'产生另一个向量为TRUE和FALSE(其中'a'> 0或者不是).
如果你想测试是否有'a> 0'的任何值,你可以使用函数 - 'any'或'all'
最好