0

重複の可能性:
ベクトル化されたステートメントを使用する場合は R

ここで関数を最適にベクトル化する方法について同様の質問がいくつかありますが、データ フレームの行ごとに if 型関数を適用する例はまだ見つかりません。

1912年から2010年までの年の値を保持する列「年」を持つデータフレームdfを指定します。特定の年がテスト年(1948など)の前後にあるかどうかのテストを適用し、文字を割り当てたいだけです」はい」または「いいえ」を別の列に入力します。簡単なはず...

現在、私は次のようにコードを書いています:

i = 1
while (i < nrow(df)) {
     if (df$Year[i] < 1948) {
         df$Test[i] <- "Yes"        
     } else { df$Test[i] <- "No"
     }
     i = i + 1
 }

上記は機能しますが、大規模なデータセットでは速度が低下します.Rには、より「エレガントな」ソリューションが必要であることを知っています.より良いアプローチの使用は適用されますか? それとももっと簡単なものがありますか?

ありがとう!

4

2 に答える 2

4

ifelse makes more sense here.

df$Test <- ifelse(df$Year < 1948, "Yes", "No")

ifelse is a vectorized version of the if/else construct. When using R it almost always makes more sense to go with a vectorized solution if it's possible.

于 2012-10-31T15:36:28.397 に答える
3

ifelse()代わりに、ベクトル化されてreturns a value with the same shape as test which is filled with elements selected from either yes or no depending on whether the element of test is TRUE or FALSEいるか、ヘルプページにそう書かれています。

例えば:

> years <- 1980:2000

> ifelse(years < 1986, "old", "young")
 [1] "old"   "old"   "old"   "old"   "old"   "old"   "young" "young" "young" "young" "young" "young" "young" "young" "young"
[16] "young" "young" "young" "young" "young" "young"

ifelse()Excel に慣れていれば、2 つ以上の条件がある場合は、ステートメントをネストすることもできます。=IF()

ifelse(years < 1986, "old", ifelse(years < 1996, "medium", "young"))
于 2012-10-31T15:37:43.100 に答える