关闭

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

标签: r语言向量化编程sapplymutate向量化
4740人阅读 评论(1) 收藏 举报
分类:


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

原因:向量和标量的问题

举例:

> 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
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:57935次
    • 积分:909
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:6篇
    • 译文:0篇
    • 评论:2条
    最新评论