3

以下のステートメントを実行した後、agenew (データフレームの 2 番目の表示の 23 行目) に対して "4" が表示されるのはなぜですか? 代わりに「0」を取得する必要があるようです。

agenew[is.na(agenew)] <- 4 * sibsp + 3 * parch

これは、ステートメントを実行する前のデータフレームです。

    age sibsp agenew parch
1  34.5     0     69     0
2  47.0     1     98     0
3  62.0     0    124     0
4  27.0     0     54     0
5  22.0     1     48     1
6  14.0     0     28     0
7  30.0     0     60     0
8  26.0     1     56     1
9  18.0     0     36     0
10 21.0     2     50     0
11   NA     0     NA     0
12 46.0     0     92     0
13 23.0     1     50     0
14 63.0     1    130     0
15 47.0     1     98     0
16 24.0     1     52     0
17 35.0     0     70     0
18 21.0     0     42     0
19 27.0     1     58     0
20 45.0     0     90     0
21 55.0     1    114     0
22  9.0     0     18     1
23   NA     0     NA     0

これは、ステートメントを実行した後のデータフレームです

> newdf
    age sibsp agenew parch
1  34.5     0     69     0
2  47.0     1     98     0
3  62.0     0    124     0
4  27.0     0     54     0
5  22.0     1     48     1
6  14.0     0     28     0
7  30.0     0     60     0
8  26.0     1     56     1
9  18.0     0     36     0
10 21.0     2     50     0
11   NA     0      0     0
12 46.0     0     92     0
13 23.0     1     50     0
14 63.0     1    130     0
15 47.0     1     98     0
16 24.0     1     52     0
17 35.0     0     70     0
18 21.0     0     42     0
19 27.0     1     58     0
20 45.0     0     90     0
21 55.0     1    114     0
22  9.0     0     18     1
23   NA     0      4     0
4

1 に答える 1

5

data.framenの行数とm(where m < n) の行数を としagenewますNA。やっている

agenew[is.na(agenew)] <- 4 * sibsp + 3 * parch

は間違っています。なぜなら、左側には lengthmがあり、右側には length があるからnです。agenew23 行目 (agenew の 2 回目)の代わりに取得している「4」は、23 番目ではなく、data.frame の 2 行目のNA結果です...4 * sibsp + 3 * parch

あなたがするつもりだったのは:

agenew[is.na(agenew)] <- (4 * sibsp + 3 * parch)[is.na(agenew)]

しかし、これを行うためのより洗練された方法があります。たとえば、次のとおりです。

agenew <- ifelse(is.na(agenew), 4 * sibsp + 3 * parch, agenew)

ここで、すべてのベクトルには length がありnます。

注:質問で行ったように、data.frame内でこれらすべてのステートメントを評価する必要がある部分をスキップしています(、、、withなどを参照)withintransform

df <- transform(df, agenew = ifelse(is.na(agenew), 4 * sibsp + 3 * parch, agenew))
于 2013-06-16T14:50:17.053 に答える