执行以下语句后,为什么agenewnew为“ 4”(数据框第二个显示的第23行)?看来我应该得到一个“ 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

最佳答案

假设n是data.frame中的行数,而m(其中m < n)是agenewNA的行数。在做

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


这是错误的,因为左侧的长度为m,而右侧的长度为n。您要替换第23行上的agenew的“ 4”(第二次agenew是NA)是data.frame第二行上的4 * 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))

10-08 18:10