在使用R时尝试替换NA时得到奇数值

时间:2013-06-16 14:34:11

标签: r na

为什么在执行下面的语句后,我的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

1 个答案:

答案 0 :(得分:5)

允许n为data.frame中的行数,m(其中m < n)为agenewNA的行数。做

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中评估所有这些语句的部分(请参阅withwithintransform,等),例如:

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