我有一个数组:
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)
并且想要实现以下功能:
w<-function(a){
if (a>0){
a/sum(a)
}
else 1
}
此函数将检查a
中是否有大于0的值,如果有,则将每个元素除以总和。
否则它应该只记录1。
我收到以下警告消息:
Warning message:
In if (a > 0) { :
the condition has length > 1 and only the first element will be used
我该如何修正功能?
7条答案
按热度按时间vsdwdz231#
也许你想要
ifelse
:bfnvny8b2#
if
语句未向量化。对于向量化if语句,应使用ifelse
。在您的情况下,只需编写或短的矢量化版本
这取决于你想使用哪一个,因为第一个函数给出长度为1的输出向量(在else部分),
ifelse
给出长度等于a
的输出向量。cwdobuhd3#
我只是想补充一点,为什么会出现这个警告(我之前并不清楚)。之所以会出现这个警告,是因为这里的a是一个向量,而不等式a〉0产生了另一个TRUE和FALSE的向量(其中a是否〉0)。
如果您想测试是否有任何'a〉0'的值,您可以使用函数- 'any'或'all'
最佳
2g32fytz4#
下面是不使用
ifelse
的简单方法:举个例子:
hsgswve45#
我处理这个问题的方式是,当我尝试做一些类似的事情时,我定义了一个函数,并且像其他人指出的那样,它是用数组调用的
您可以这样做,但是对于这种情况,与Sven的方法相比,它没有那么优雅。
cigdeys36#
正常创建函数后使用
lapply
函数。lapply
给出了一个列表,因此使用unlist
函数将它们从函数中取出hgncfbus7#
我认为最有效的方法是user1317221_G的答案。但是,如果您想回到基础,那么使用for函数在向量的长度上循环(因为if函数在向量的长度上不起作用)会很有用。