2013-10-26 80 views
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 

我有一些规则改变的事实(e.x由3个要素,即有(数据== “M”)乘)。

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

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

回答

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

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]) 
相关问题