Jednym z podstawowych typów danych w R są współczynniki. Z mojego doświadczenia wynika, że czynniki są w zasadzie uciążliwe i nigdy ich nie używam. Zawsze konwertuję na postacie. Dziwnie czuję, że czegoś mi brakuje.
Czy istnieją ważne przykłady funkcji, które wykorzystują czynniki jako zmienne grupujące, w przypadku których typ danych czynnika staje się konieczny? Czy istnieją szczególne okoliczności, w których powinienem używać współczynników?
r
language-design
internals
r-factor
JD Long
źródło
źródło
Odpowiedzi:
Powinieneś używać współczynników. Tak mogą być ból, ale moja teoria jest taka, że 90% tego, dlaczego są one uciążliwe jest bo
read.table
iread.csv
argumentstringsAsFactors = TRUE
domyślnie (a większość użytkowników przegap tej subtelności). Twierdzę, że są przydatne, ponieważ pakiety dopasowania modeli, takie jak lme4, używają współczynników i współczynników uporządkowanych, aby w różny sposób dopasować modele i określić rodzaj kontrastów, których należy użyć. Pakiety graficzne również używają ich do grupowania według.ggplot
a większość funkcji dopasowywania modeli wymusza przekształcenie wektorów znaków na czynniki, więc wynik jest taki sam. Jednak w kodzie pojawiają się ostrzeżenia:Jedna trudna sprawa to całość
drop=TRUE
. W wektorach działa to dobrze, aby usunąć poziomy czynników, których nie ma w danych. Na przykład:Jednak w przypadku
data.frame
s zachowanie[.data.frame()
jest inne: zobacz tego e-maila lub?"[.data.frame"
. Używaniedrop=TRUE
nadata.frame
s nie działa tak, jak można sobie wyobrazić:Na szczęście możesz łatwo upuścić współczynniki,
droplevels()
aby zrzucić niewykorzystane poziomy współczynników dla pojedynczego czynnika lub dla każdego czynnika w adata.frame
(od R 2.12):W ten sposób możesz powstrzymać wybrane poziomy przed pojawieniem się
ggplot
legend.Wewnętrznie
factor
s są liczbami całkowitymi z wektorem znaków na poziomie atrybutu (zobaczattributes(iris$Species)
iclass(attributes(iris$Species)$levels)
), który jest czysty. Gdybyś musiał zmienić nazwę poziomu (i używałeś ciągów znaków), byłaby to znacznie mniej wydajna operacja. Często zmieniam nazwy poziomów, szczególnie w przypadkuggplot
legend. Jeśli sfałszujesz czynniki za pomocą wektorów znaków, istnieje ryzyko, że zmienisz tylko jeden element i przypadkowo utworzysz oddzielny nowy poziom.źródło
stringsAsFactors
nie jest funkcją.uporządkowane czynniki są niesamowite, jeśli przypadkiem kocham pomarańcze i nienawidzę jabłek, ale nie mam nic przeciwko winogronom, nie muszę zarządzać jakimś dziwnym indeksem, żeby to powiedzieć:
źródło
d$f <- ordered(d$f, c("apples", "grapes", "oranges"))
zrobił? Domyśliłbym się, że zamówił je w ramce danych, ale po uruchomieniu tej linii i wydrukowaniu ramki danych nic się nie zmienia. Czy po prostu narzuca zamówienie wewnętrzne, mimo że wydrukowane zamówienie się nie zmienia?A
factor
jest najbardziej analogiczne do typu wyliczonego w innych językach. Jego właściwe użycie dotyczy zmiennej, która może przyjmować tylko jeden z określonych zestawów wartości. W takich przypadkach nie każda możliwa dozwolona wartość może występować w jakimkolwiek konkretnym zbiorze danych, a „puste” poziomy dokładnie to odzwierciedlają.Rozważ kilka przykładów. W przypadku niektórych danych, które zostały zebrane w całych Stanach Zjednoczonych, jako czynnik należy podać stan. W tym przypadku istotny jest fakt, że żadne sprawy nie zostały odebrane z danego państwa. Mogły być dane z tego stanu, ale zdarzyło się (z jakiegokolwiek powodu, który może być powodem zainteresowania), że ich nie było. Gdyby zebrano rodzinne miasto, nie miałoby to znaczenia. Nie ma z góry określonego zestawu możliwych miast rodzinnych. Gdyby dane były zbierane z trzech miast, a nie z całego kraju, to miasto byłoby czynnikiem: na początku podano trzy opcje, a jeśli w jednym z tych trzech miast nie znaleziono żadnych odpowiednich przypadków / danych, jest to istotne.
Inne aspekty
factor
s, takie jak zapewnienie sposobu nadania arbitralnej kolejności zbioru ciągów, są użytecznymi cechami drugorzędnymifactor
s, ale nie są powodem ich istnienia.źródło
Czynniki są fantastyczne, gdy ktoś wykonuje analizę statystyczną i faktycznie eksploruje dane. Jednak wcześniej, gdy ktoś czyta, czyści, rozwiązuje problemy, łączy i ogólnie manipuluje danymi, czynniki są totalnym bólem. Niedawno, podobnie jak w ciągu ostatnich kilku lat, wiele funkcji uległo poprawie, aby lepiej radzić sobie z czynnikami. Na przykład, rbind ładnie się z nimi gra. Nadal uważam za uciążliwe pozostawienie pustych poziomów po funkcji podzbioru.
Wiem, że łatwo jest przekodować poziomy współczynnika i zmienić etykiety, a także są wspaniałe sposoby na zmianę kolejności poziomów. Mój mózg po prostu ich nie pamięta i za każdym razem, kiedy go używam, muszę się uczyć na nowo. Przekodowywanie powinno być o wiele łatwiejsze niż jest.
Funkcje łańcuchowe języka R są dość łatwe i logiczne w użyciu. Więc kiedy manipuluję, generalnie wolę postacie od czynników.
źródło
droplevels()
. I domyślnie nie zmienia kolejności czynników.Co za złośliwy tytuł!
Uważam, że wiele funkcji estymacji pozwala na łatwe definiowanie zmiennych fikcyjnych za pomocą współczynników ... ale nie używam ich do tego.
Używam ich, gdy mam bardzo duże wektory znaków z kilkoma unikalnymi obserwacjami. Może to zmniejszyć zużycie pamięci, zwłaszcza jeśli łańcuchy w wektorze znakowym są dłuższe.
PS - żartuję z tytułu. Widziałem twój tweet. ;-)
źródło
?factor
tym, że był to R-2.6.0 i mówi: „Wartości całkowite są przechowywane w 4 bajtach, podczas gdy każde odwołanie do ciągu znaków wymaga wskaźnika 4 lub 8 bajtów”. Czy zaoszczędziłbyś miejsce na konwersji na czynnik, gdyby ciąg znaków wymagał 8 bajtów?N=100000
Dostałem 391,5 Kb vs 391,8 Kb. Tak więc czynnik zajmuje niewiele więcej pamięci.Czynniki to doskonały mechanizm oznaczania „unikalnych przypadków”. Odtworzyłem to źle wiele razy i pomimo kilku sporadycznych zmarszczek, są one niezwykle silne.
Jeśli istnieje lepszy sposób wykonania tego zadania, chciałbym to zobaczyć, nie widzę omawianej możliwości
factor
.źródło
tapply (i agregacja ) polegają na czynnikach. Stosunek informacji do nakładu pracy tych funkcji jest bardzo wysoki.
Na przykład w jednej linii kodu (wezwanie do tapply poniżej) możesz uzyskać średnią cenę diamentów według szlifu i koloru:
źródło