为什么在执行下面的语句后,我的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
答案 0 :(得分:5)
允许n
为data.frame中的行数,m
(其中m < n
)为agenew
为NA
的行数。做
agenew[is.na(agenew)] <- 4 * sibsp + 3 * parch
是错误的,因为左侧的长度为m
,而右侧的长度为n
。您在第23行(第二次agenew为agenew
)上替换为NA
的“4”是您的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))