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

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

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

米琪卡哇伊 2019-08-03 07:03:03
解释从‘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 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞


也许你想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-08-04
?
ibeautiful

TA贡献1993条经验 获得超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-08-04
?
POPMUISE

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


这里有一个简单的方法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-08-04
  • 3 回答
  • 0 关注
  • 981 浏览

添加回答

举报

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