3

为什么在执行以下语句后,agenew(数据框第二次显示的第 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

n您的 data.frame 中的行数和m(哪里m < n)行数 where agenewis NA。正在做

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

是错误的,因为左侧有长度m,而右侧有长度nagenew您在第 23 行(第二次 agenew 是NA)上获得的“4”是data.frame4 * sibsp + 3 * parch的第二行的结果,而不是第 23 行的结果......

你的意思是:

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

但是有更优雅的方法可以做到这一点,例如:

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

在这里,所有向量都有长度n

注意:正如您在问题中所做的那样,我将跳过应在您的 data.frame 中评估所有这些语句的部分(请参阅withwithintransform等),例如:

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