执行以下语句后,为什么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
)是agenew
是NA
的行数。在做
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中评估所有这些语句的部分(请参见
with
,within
,transform
等),例如:df <- transform(df, agenew = ifelse(is.na(agenew), 4 * sibsp + 3 * parch, agenew))