R语言的告警”条件的长度大于一,因此只能用其第一元素“的解决办法


告警:”条件的长度大于一,因此只能用其第一元素“

原因:向量和标量的问题

举例:

> x<-seq(-2,2);  # x是个长度为5的向量
> x
[1] -2 -1  0  1  2
> if(x>0) 1 else 0  
[1] 0
Warning message: 如果x的长度>1,只使用x的第一个元素,x的第一个元素是-2,所以输出是0
In if (x > 0) 1 else 0 :
  the condition has length > 1 and only the first element will be used
正确的方式应该是:

> y <- numeric(length(x)) ;#首先将输出结果初始化长度与输入值相同,即一个输出结果对应一个输入
> y
[1] 0 0 0 0 0   ;#输出y初始化为长度5的0向量 
> y[x>0]<-1    ;# 每一个下标[]的值进行条件判断,条件为T/F时,赋不同的值
> y[x<=0]<-0
> y             #最终的结果实现了对向量的每个元进行了计算          
[1] 0 0 0 1 1

其实就是向量化编函数,不需要用循环,可以对数据框进行计算,不需要用lapply,mutate之类的了,简单易懂。

编了一个函数,

Tag_5_Stars(clf2_traffice[ ,3],clf2_traffice[ ,8:12]);

Tag_5_Stars=function(x,a){
 
  Stars<-numeric(length(x));
  a1<-numeric(length(a));
  a1<-a;
 
  Stars[is.na(x)]<-NA ;    # 返回NA
 
  Stars[ x<=a1[1]  ]<-0 ;     # 返回0星
 
  Stars[ (x>a1[1]) & (x<=a1[2]) ]<-1 ;    # 返回1星
 
  Stars[ (x>a1[2]) & (x<=a1[3]) ]<-2 ;    # 返回2星
 
  Stars[ (x>a1[3]) & (x<=a1[4]) ]<-3 ;    # 返回3星
 
  Stars[ (x>a1[4]) & (x<=a1[5]) ]<-4 ;    # 返回4星
 
  Stars[ x>a1[5]   ]<-5 ;    # 返回5星  
 
  Stars
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值