2

我有一个包含一些信息的数据框。有些数据是 NA。就像是:

    id fact sex
1   1    3    M
2   2    6    F
3   3    NA  <NA>
4   4    8    F
5   5    2    F
6   6    2    M
7   7    NA  <NA>
8   8    1    F
9   9   10    M
10 10   10    M

我必须通过一些规则来改变事实(例如乘以 3 个元素,这些元素具有(数据 ==“M”))。

我试过survey$fact[survey$sex== "M"] <- survey$fact[survey$sex== "M"] * 3了,但由于不适用,我有一些错误。

我知道我可以用 is.na(x) 检查元素是否为 NA,并在 [...] 中添加此条件,但我希望存在更漂亮的解决方案

4

2 回答 2

2

我真的很喜欢ifelse,它似乎总是NA对我的价值观有理想的行为。

survey$fact <- ifelse(survey$sex == "M", survey$fact * 3, survey$fact)

?ifelse显示第一个参数是测试,第二个参数是如果测试是分配的值true,最后一个参数是值 if false。如果您将原始data.frame列分配为false返回值,它将分配测试失败的行而不修改它们。

这是您所要求的扩展,以表明您也可以测试NA值。

survey$fact <- ifelse(is.na(survey$sex), survey$fact * 2, survey$fact)

我也喜欢它的可读性。

于 2013-10-26T17:01:28.387 回答
1

which可以过滤那些NAs:

survey$fact[which(survey$sex == "M")] <- survey$fact[which(survey$sex== "M")] * 3

有很多方法可以让它更干净一些,例如:

males <- which(survey$sex == "M")
survey$fact[males] <- 3 * survey$fact[males]

或者

survey <- within(survey, fact[males] <- 3 * fact[males])
于 2013-10-26T17:04:42.180 回答