告警:”条件的长度大于一,因此只能用其第一元素“
原因:向量和标量的问题
举例:
> 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
}