0

次のようなデータフレームがあります。

X Y
1 3
1 7
1 9
2 12
2 4
2 8 
3 11
3 3
3 5

X = 1 の場合は 0.25、X = 2 の場合は 0.75、X = 3 の場合は 0.95 の新しい変数 Z を作成したいと思います。

次のコードを試してみました。変数 Z を作成し、X をループして、X が特定の値であるかどうかを確認し、Z を対応する正しい値に設定します。例えば:

data$Z <- 0
for (i in 1:length(data$X)){
   if (data$X[i]==1) {data$Z <- 0.25)
   if (data$X[i]==2) {data$Z <- 0.50)
   if (data$X[i]==2) {data$Z <- 0.95)
}

問題は、何らかの理由で条件付きトリガーがこのコードで作動しないことです。最初の if ステートメントで実行すると、すべての Z が 0.25 に設定されます。最初の 2 つだけで、それらはすべて 0.50 などです。

何が起こっているのか手がかりはありますか?

4

5 に答える 5

4

ifelseベクトル化されているため、ここで使用します。

transform(dat, Z=ifelse(X==1,0.25,ifelse(X==2,0.75,0.95)))
 X  Y    Z
1 1  3 0.25
2 1  7 0.25
3 1  9 0.25
4 2 12 0.75
5 2  4 0.75
6 2  8 0.75
7 3 11 0.95
8 3  3 0.95
9 3  5 0.95

PS: ここでは、X が 3 つの値しかとらないと仮定します。

編集

私はそのような操作に sql ケースを使用するのが好きです。ビジネスロジックを明確に保ち、​​ベクトル化バージョンとして高速です(直感)

library(sqldf)
dat$newX <- sqldf('SELECT CASE X 
       WHEN 1  THEN 0.25
       WHEN 2 THEN 0.5
       ELSE 0.95
       END AS newX
      FROM dat ')
于 2013-02-20T09:35:20.063 に答える
4

この単純な例では、サブセット化を使用するのが最も簡単な方法です。

data$Z <- 0.25
data$Z[data$X==2] <- 0.50
data$Z[data$X==3] <- 0.95

ループや if/else ステートメントは必要ありません。

于 2013-02-20T09:36:15.317 に答える
4

これまでのこれらの回答はすべて、値が 3 つしかないことを前提としています (当然のことながら、そうでないと想定する理由はありません)。

ただし、3 つ以上の値があると仮定するとmerge、その場合は次のように使用できます。

# assuming this is your data (dummy)
set.seed(45)
df <- data.frame(x=rep(1:5, each=5), y=sample(25))

ここでは、 に対して 5 つの一意の値がありxます。data.frame次のように、X の値ごとに追加の列を生成する値を使用して を作成できます。

# here for each unique x, there is a value (just for example, randomly generated)
# equivalent to 0.25, 0.5 and 0.95 in your case
key <- data.frame(x=1:5, val=runif(5))

これで、次のように使用できますmerge

merge(df, key, by="x", all=T)
于 2013-02-20T10:21:59.347 に答える
3

それはたった1つのifelseコマンドで動作します:

transform(dat, Z = ifelse(X == 3, 0.95, 0.25 + 0.5 * (X - 1)))

  X  Y    Z
1 1  3 0.25
2 1  7 0.25
3 1  9 0.25
4 2 12 0.75
5 2  4 0.75
6 2  8 0.75
7 3 11 0.95
8 3  3 0.95
9 3  5 0.95

それは何もなしでさえ機能しますifelse(数学のおかげで):

transform(dat, Z = 0.25 + round(0.50 * (X - 1) ^ .48, 2))

  X  Y    Z
1 1  3 0.25
2 1  7 0.25
3 1  9 0.25
4 2 12 0.75
5 2  4 0.75
6 2  8 0.75
7 3 11 0.95
8 3  3 0.95
9 3  5 0.95
于 2013-02-20T09:39:35.547 に答える
3

x がこれらの条件を満たす同じインデックスでZ を必要な値に設定する必要があるため、次のようになります。

data$Z <- 0
for (i in 1:length(data$X)){
   if (data$X[i]==1) {data$Z[i] <- 0.25)
   if (data$X[i]==2) {data$Z[i] <- 0.50)
   if (data$X[i]==3) {data$Z[i] <- 0.95)
}
于 2013-02-20T09:32:11.887 に答える