1. ホーム
  2. r

[解決済み] data.frame 内の値の条件付き置換

2023-07-30 21:52:37

質問

ループを使用せずにデータフレーム内の値を条件付きで置換する方法を理解しようとしています。私のデータフレームは次のように構成されています。

> df
          a b est
1  11.77000 2   0
2  10.90000 3   0
3  10.32000 2   0
4  10.96000 0   0
5   9.90600 0   0
6  10.70000 0   0
7  11.43000 1   0
8  11.41000 2   0
9  10.48512 4   0
10 11.19000 0   0

で、その dput の出力はこうなります。

structure(list(a = c(11.77, 10.9, 10.32, 10.96, 9.906, 10.7, 
11.43, 11.41, 10.48512, 11.19), b = c(2, 3, 2, 0, 0, 0, 1, 2, 
4, 0), est = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), .Names = c("a", 
"b", "est"), row.names = c(NA, -10L), class = "data.frame")

やりたいことは b . もし b が 0 ならば esta . 私は、以下のことを理解しています。 df$est[df$b == 0] <- 23 のすべての値を設定します。 est の値を 23 に設定します。 b==0 . 私が理解していないのは、どのようにして est の値に a の値に変換する。例えば

df$est[df$b == 0] <- (df$a - 5)/2.533 

は以下のような警告を出します。

Warning message:
In df$est[df$b == 0] <- (df$a - 5)/2.533 :
  number of items to replace is not a multiple of replacement length

vectorではなく、該当するセルを渡す方法はありますか?

どのように解決するのですか?

条件付きインデックスを作成しているため df$est を条件付きでインデックス付けしているので、置換ベクトル df$a :

index <- df$b == 0
df$est[index] <- (df$a[index] - 5)/2.533 

もちろん、変数 index は一時的なもので、コードをもう少し読みやすくするために使っています。 1ステップで書けます。

df$est[df$b == 0] <- (df$a[df$b == 0] - 5)/2.533 

さらに読みやすくするために within :

df <- within(df, est[b==0] <- (a[b==0]-5)/2.533)

どの方法を選んでも、結果は

df
          a b      est
1  11.77000 2 0.000000
2  10.90000 3 0.000000
3  10.32000 2 0.000000
4  10.96000 0 2.352941
5   9.90600 0 1.936834
6  10.70000 0 2.250296
7  11.43000 1 0.000000
8  11.41000 2 0.000000
9  10.48512 4 0.000000
10 11.19000 0 2.443743


他の方が指摘されているように、あなたの例では別の解決方法として ifelse .