1. ホーム
  2. R

Rの警告 "条件の長さが1より大きいので、最初の要素しか使えない "に対する解決策

2022-02-19 19:08:48


アラート: "条件の長さが1より大きいので、その最初の要素のみ使用できます"。

理由: ベクトルとスカラーに関する問題

> x<-seq(-2,2); # x is a vector of length 5
> x
[1] -2 -1 0 1 2
> if(x>0) 1 else 0  
[1] 0
Warning message: If the length of x >1, only the first element of x is used, and the first element of x is -2, so the output is 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)); # first initialize the output to be the same length as the input, i.e. one output corresponds to one input
> y
[1] 0 0 0 0 0 0 0; # output y initialized to a 0 vector of length 5 
> y[x>0]<-1; # Each subscript [] value is conditioned, and a different value is assigned when the condition is T/F
> y[x<=0]<-0
> y # The final result implements the calculation for each element of the vector          
[1] 0 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つ返す  
  星
}