0

R で for ループを使用すると問題が発生します。次のコード

a <- seq(-2, 5)
for(i in 1:length(a)){
  a[i] <- if(a[i] <= 0) "aa" else a[i]
}

次のベクトルになるはずです

> a
[1] "aa" "aa" "aa" "1"  "2"  "3"  "4"  "5"

代わりに、次の結果が得られます。

> a
[1] "aa" "-1" "aa" "1"  "2"  "3"  "4"  "5" 

R が "-1" を "aa" に置き換えられないのはなぜですか?

正常に機能する別のソリューションを試しました。

a <- seq(-2, 5)
b <- NULL
for(i in 1:length(a)){
  b[i] <- if(a[i] <= 0) "aa" else a[i]
}

期待される結果が生成されます。

> b
[1] "aa" "aa" "aa" "1"  "2"  "3"  "4"  "5" 

後者の例はうまく機能し、最初の例はうまくいかないのはなぜですか?

ご助力ありがとうございます!

よろしくお願いします!!

4

1 に答える 1

4

照合シーケンスは、あなた (またはマシュー) が理解しているものとは異なる場合があります。文字「-」は、オペレーティング システムの字句順序で下位にない場合があります。文字列比較は OS 固有です。( を参照してください?Comparison) 最初の置換の後、ベクトル全体が強制的に文字に変換さ"-" > 0れ、マシンで TRUE が返された場合は、答えがあります。このコードが期待どおりに動作することは間違いありません。

a <- seq(-2, 5)
for(i in 1:length(a)){
  a[i] <- if( as.numeric(a[i]) <= 0) "aa" else a[i]
}

Henrik の提案も、最初に数値比較から論理ベクトルを作成し、次に "aa" とa.

(2 番目の例では、ベクトルから文字への強制はありませんでした。)

于 2013-11-13T23:33:36.033 に答える