选择数据框中的一些项目并进行更改

时间:2013-10-26 16:58:03

标签: r dataframe

我有一个包含一些信息的数据框。一些数据是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

我必须通过某种规则来改变事实(e.x。乘以3个元素,有(data ==“M”))。

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

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

2 个答案:

答案 0 :(得分:2)

我非常喜欢ifelse,对我来说似乎总是有NA值所需的行为。

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

?ifelse表示第一个参数是测试,第二个参数是测试为true时分配的值,最后一个参数是false时的值。如果您将原始data.frame列指定为false返回值,则会为其分配测试失败的行而不进行修改。

这是您提出的问题的扩展,以表明您还可以测试NA值。

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

我也很喜欢它的可读性。

答案 1 :(得分:1)

which可以过滤那些NA s:

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])