2013-04-25 2 views
2

У меня есть набор данных, DATA, с переменной VAR. Этот режим переменных является числовым, и его класс является фактором. Он представляет собой пол. Когда распечатывается, это выглядит, как показано нижеЗадайте значения переменных, отсутствующие в R, и снимите неиспользуемые уровни

VAR 
    M 
    M 
    F 
    U 

    M 

Когда я распечатать уровни, он выводит: «» «F», «М», «U», и таблица частот выглядит следующим образом:

 F  M  U 
2 30 25 1 

Что я хочу сделать, это изменить все, что не является «F» или «M», чтобы быть недостающими значениями, а затем наделить их «Человек» и «Женщина» и сбросить неиспользуемые уровни для переменной (но все равно оставить уровень отсутствует). До сих пор у меня есть код ниже:

DATA$VAR[DATA$VAR == "U" | DATA$VAR == ""] <- NA 

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

 F  M  U 
0 30 25 0 

Я чувствую, что я близко, но не совсем там. Я не понимаю, как бороться с проблемами уровня. Любая помощь приветствуется.

+2

'droplevels (DATA)' или 'droplevels (DATA $ VAR)'. – Justin

ответ

4

Чтобы создать фактор, где все, что было запретить M и F становятся отсутствующим использование levels внутри вызова к фактору. Чтобы переименовать их использовать labels аргумент

a <- factor(c("M","M","F","U","","M")) 

a2 <- factor(a, levels = c('M','F'), labels =c('Male','Female')) 

a2 
# [1] Male Male Female <NA> <NA> Male 
# Levels: Male Female 

Если вы хотите подсчитывать значения NA в table, установите useNA = 'always' или useNA='ifany'

table(a2, useNA = 'ifany') 
## a2 
## Male Female <NA> 
##  3  1  2 
2

Я думаю, что вы можете просто перезаписать уровни факторов.

a = factor(c("M","M","F","U","","M")) 
table(a) 
# a 
# F M U 
# 1 1 3 1 
levels(a)[!levels(a)%in%c("M","F")] <- NA 
table(a) 
# a 
# F M 
# 1 3 

EDIT: Точно так же, переобозначений уровни:

levels(a) 
# "F" "M" 
levels(a) <- c("Female","Male") 
3

Вы также есть droplevels() в R!

a = factor(c("M","M","F","U","M")) 

a.sub <- subset(a, a != "U") 

droplevels(a.sub)