R语言 解释来自“if "函数的“条件长度>1”警告

eqqqjvef  于 2022-12-20  发布在  其他
关注(0)|答案(7)|浏览(211)

我有一个数组:

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

我该如何修正功能?

vsdwdz23

vsdwdz231#

也许你想要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
bfnvny8b

bfnvny8b2#

if语句未向量化。对于向量化if语句,应使用ifelse。在您的情况下,只需编写

w <- function(a){
if (any(a>0)){
  a/sum(a)
}
  else 1
}

或短的矢量化版本

ifelse(a > 0, a/sum(a), 1)

这取决于你想使用哪一个,因为第一个函数给出长度为1的输出向量(在else部分),ifelse给出长度等于a的输出向量。

cwdobuhd

cwdobuhd3#

我只是想补充一点,为什么会出现这个警告(我之前并不清楚)。之所以会出现这个警告,是因为这里的a是一个向量,而不等式a〉0产生了另一个TRUE和FALSE的向量(其中a是否〉0)。
如果您想测试是否有任何'a〉0'的值,您可以使用函数- 'any'或'all'
最佳

2g32fytz

2g32fytz4#

下面是不使用ifelse的简单方法:

(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
hsgswve4

hsgswve45#

我处理这个问题的方式是,当我尝试做一些类似的事情时,我定义了一个函数,并且像其他人指出的那样,它是用数组调用的
您可以这样做,但是对于这种情况,与Sven的方法相比,它没有那么优雅。

sapply(a, function(x) afunc(x))

afunc<-function(a){
  if (a>0){
    a/sum(a)
  }
  else 1
}
cigdeys3

cigdeys36#

正常创建函数后使用lapply函数。

lapply(x="your input", fun="insert your function name")

lapply给出了一个列表,因此使用unlist函数将它们从函数中取出

unlist(lapply(a,w))
hgncfbus

hgncfbus7#

我认为最有效的方法是user1317221_G的答案。但是,如果您想回到基础,那么使用for函数在向量的长度上循环(因为if函数在向量的长度上不起作用)会很有用。

w <- c() ##creates empty vector named 'w'
for(i in 1:length(a)){
  if (a[i]>0){
    w[i] <- a[i]/sum(a)
  }
  else 
    w[i] <- 1
}

相关问题