我正在尝试创建性别分布功能。有没有办法将字母定义为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()给出了上述所有内容的计数
答案 0 :(得分:0)
除了因素外,还有几种编码性别的可能性:
1.作为字符,而不是因素。您仍然需要将您的功能称为func("F")
2.您已经考虑过自己使用数字。缺点是可能不清楚1是男性还是女性
3.恕我直言的最佳选择是二进制。将您的专栏命名为“男性”,并使用TRUE
,FALSE
和NA
来表示未知。二进制文件在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