为了账号安全,请及时绑定邮箱和手机立即绑定

解释从‘if’函数发出的“条件有长度>1”警告

解释从‘if’函数发出的“条件有长度>1”警告

HUWWW 2019-07-20 13:01:29
解释从‘if’函数发出的“条件有长度>1”警告我有一个数组: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如何纠正这个函数?
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

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


查看完整回答
反对 回复 2019-07-20
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

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

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

或者是一个简短的矢量化版本

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

这取决于您想要使用哪一个,因为第一个函数给出长度为1的输出向量(在其他部分中)和ifelse给出长度等于a.


查看完整回答
反对 回复 2019-07-20
?
噜噜哒

TA贡献1784条经验 获得超7个赞

这里有一个简单的方法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


查看完整回答
反对 回复 2019-07-20
  • 3 回答
  • 0 关注
  • 1005 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信