我有一个包含一些信息的数据框。一些数据是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,并在[...]中添加这个条件,但我希望存在更漂亮的解决方案
答案 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])