【问题标题】:getting odd value when trying to replace NA when using R使用 R 时尝试替换 NA 时得到奇数
【发布时间】:2013-06-16 14:34:10
【问题描述】:

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

【问题讨论】:

  • 试试newdf$agenew[is.na(newdf$agenew)] &lt;- 4 * newdf$sibsp + 3 * newdf$parch

标签: r na


【解决方案1】:

n 是你的data.frame 中的行数,m(其中m &lt; n)是agenewNA 的行数。正在做

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

是错误的,因为左侧的长度为m,而右侧的长度为n。您在第 23 行(第二次 agenew 是 NA)上获得的“4”作为 agenew 的替代品是 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))

【讨论】:

  • 看了你的建议后, ifelse 函数对我来说似乎是一个更好的方法。我会用的。
  • 我在使用 R 时有点尴尬。我正在重新运行 data.frame 函数来评估 newdf。 newdf
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多