2013-07-28 18 views
7

Mam ramkę danych o nazwie "ubezpieczenie" ze zmiennymi numerycznymi i czynnikowymi. Jak mogę wybrać wszystkie zmienne czynników, aby móc sprawdzić poziomy zmiennych jakościowych?Jak wybrać wszystkie zmienne czynników w R

Próbowałem sapply(insurance,class), aby uzyskać klasy wszystkich zmiennych. Ale nie mogę logicznego argumentu na podstawie, jeśli class(var)="factor" jako nazwy zmiennych są również zawarte w wyniku sapply().

Dzięki,

Odpowiedz

12

Niektóre dane:

insurance <- data.frame(
    int = 1:5, 
    fact1 = letters[1:5], 
    fact2 = factor(1:5), 
    fact3 = LETTERS[3:7] 
) 

użyłbym sapply jak ty, ale w połączeniu z is.factor wrócić logiczną Vector:

is.fact <- sapply(insurance, is.factor) 
# int fact1 fact2 fact3 
# FALSE TRUE TRUE TRUE 

Następnie użyj [ wyodrębnić te kolumny:

factors.df <- insurance[, is.fact] 
# fact1 fact2 fact3 
# 1  a  1  C 
# 2  b  2  D 
# 3  c  3  E 
# 4  d  4  F 
# 5  e  5  G 

Wreszcie, aby uzyskać poziom, użyj lapply:

lapply(factors.df, levels) 
# $fact1 
# [1] "a" "b" "c" "d" "e" 
# 
# $fact2 
# [1] "1" "2" "3" "4" "5" 
# 
# $fact3 
# [1] "C" "D" "E" "F" "G" 

Można również znaleźć str(insurance) ciekawe jak krótkie podsumowanie.

-2

pomocą ramki danych „ubezpieczenie” od flodel aby wszystkie czynniki naraz, można użyć apply, tak:

apply(insurance,2,factor) 

    int fact1 fact2 fact3 
[1,] "1" "a" "1" "C" 
[2,] "2" "b" "2" "D" 
[3,] "3" "c" "3" "E" 
[4,] "4" "d" "4" "F" 
[5,] "5" "e" "5" "G" 

jeśli są odsetki tylko w poziomie jednego czynnika możesz wykonaj następujące czynności:

factor(insurance$fact1) 

[1] a b c d e 
Levels: a b c d e 
+1

I nie był to pierwszy downvote, ale powodem do dodawania negatywności jest, aby zniechęcić cię do używania 'apply', gdy nie jest to właściwe. Zmusza swój pierwszy argument do macierzy, macierzy znaków tutaj. Informacja o czynniku zostanie utracona. –

+1

DWin, dzięki za pozostawienie komentarza ze zgłoszeniem. Nie zdawałem sobie sprawy z tego, że problem "zastosuj" może spowodować, że użyję go tak, jak zasugerowałem. Chciałbym zachęcić wszystkich do dodania krótkiego komentarza, kiedy zamiast "po prostu to robię", to nie jest osobiste, a przemyślane komentarze mogą dodać tyle wiedza dla społeczności jako prawidłowe odpowiedzi. – hvollmeier

1

to (prawie) pojawia się doskonała okazja, aby korzystać z funkcji rzadko używany rapply

rapply(insurance, class = "factor", f = levels, how = "list") 

Albo

Filter(Negate(is.null),rapply(insurance, class = "factor", f = levels, how = "list")) 

Aby usunąć NULL elementy (które nie były czynnikami)

Albo po prostu

lapply(Filter(is.factor,insurance), levels)) 
Powiązane problemy