数字与因素& IF语句

时间:2016-03-13 07:56:34

标签: r function if-statement

我正在尝试创建性别分布功能。有没有办法将字母定义为as.factor以外的其他字母?我想操作func(F)而不是func("F")。或者我应该输入数字:func(0)func(1)func(2)

我还用一个设计为空闲时操作的else完成了声明,但没有。如果我将函数减少到不包含IF语句,则空白变量可以正常工作:

genderDist <- function(){
    cat("Female:", sum(voterData$GENDER == "F"))
}

提前致谢!干杯!

完整声明:

genderDist <- function(x){

  if (x == "F"){
    cat("Female:", sum(voterData$GENDER == "F"))
  }

  else if (x == "M"){
    cat("Male:", sum(voterData$GENDER == "M"))
  }

  else if(x == "U"){
    cat("Unknown:", sum(voterData$GENDER == ""))
  }

  else{
    cat("Female:", sum(voterData$GENDER == "F"))
    cat("Male:", sum(voterData$GENDER == "M"))
    cat("Unknown:", sum(voterData$GENDER == ""))
  }

期望的结果: genderDist(F)给出了女性的数量 genderDist(M)给出了男性的数量 genderDist(U)给出未知数 genderDist()给出了上述所有内容的计数

1 个答案:

答案 0 :(得分:0)

除了因素外,还有几种编码性别的可能性:
1.作为字符,而不是因素。您仍然需要将您的功能称为func("F") 2.您已经考虑过自己使用数字。缺点是可能不清楚1是男性还是女性 3.恕我直言的最佳选择是二进制。将您的专栏命名为“男性”,并使用TRUEFALSENA来表示未知。二进制文件在if语句中也很有效。从if(is.na(male)) ... ; else if(male)开始。

修改
但为了达到理想的结果,性别编码不是问题,我会采用这种方法:

#First, define variables Fe, Ma and Un
#WARNING: Do NOT USE 'F', as 'F' is an abbr. for 'FALSE'!!

Fe <- "F"
Ma <- "M"
Un <- "U"
#now define a lookup dataframe for convienience
LT <- data.frame(code = c(Fe,Ma,Un), name = c("Female","Male","Unknown"), stringsAsFactors = FALSE)

# then define your function without an ifelse needed    
genderDist <- function(x){
    cat(LT[LT$code == x,"name"], sum(voterData$GENDER == x))
    }

介绍一些假数据:

voterData <- data.frame(GENDER= c("F","F","F","M","M","U"))

然后运行功能:

> genderDist(Fe)  
Female 3  
> genderDist(Ma)  
Male 2  
> genderDist(Un)  
Unknown 1