2016-03-13 2 views
0

Я пытаюсь создать функцию для распределения по полу. Есть ли способ определить букву как нечто отличное от as.factor? Я хотел бы использовать func(F) вместо func("F"). Или мне нужно числовое: func(0), func(1), func(2)?Числовые аргументы и утверждения IF

Я также закончил заявление с помощью 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 (М) дает количество самцов genderDist (U) дает количество неизвестных genderDist() дает подсчет для всех указанных выше

+0

Знаете ли вы функцию 'table'? Попробуйте 'table (voterData $ GENDER)'. – nicola

+0

@nicola да, но функции не моя проблема, а скорее утверждение IF. функции работают нормально. – Geppelt

+0

Мне не очень понятно. Кажется, ваша функция вычисляет значения значений в векторе, что и делает 'table', поэтому я не вижу причины изобретать колесо. Что не работает для вас? Пожалуйста, поделитесь примерами того, что вы хотите выполнить. Как вы используете свою функцию? Получаете ли вы ошибки или вы просто не получаете желаемого результата? – nicola

ответ

0

Есть несколько возможностей для кодирования пол, помимо фактора:
1. как характер, а не как фактор. Вам все равно придется называть вашу функцию, например, func("F").
2. Вы уже подумали об использовании numeric самостоятельно. Недостатком является то, что может быть неясно, является ли 1 мужчиной или женщиной.
3. Лучший вариант ИМХО должен был пойти двоичный. Назовите свою колонку «мужчина» и используйте TRUE, FALSE и NA для неизвестных. Бинар также отлично работает в вашем if-заявлении. Начните с if(is.na(male)) ... ; else if(male).

EDIT
Но чтобы достичь желаемого результата, кодирование пола не проблема, я бы такой подход:

#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 
+0

Спасибо, но опции 2 и 3 не заботятся о пустой переменной. – Geppelt

+0

@Geppelt Я добавил еще один подход к вашей проблеме, который, я думаю, лучше. Дайте мне знать, если это сработает? – RHA

+0

Спасибо! Прекрасно работает! – Geppelt

Смежные вопросы