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
i read.csv
argument stringsAsFactors = 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:
lm(Petal.Length ~ -1 + Species, data=iris)
# Call:
# lm(formula = Petal.Length ~ -1 + Species, data = iris)
# Coefficients:
# Speciessetosa Speciesversicolor Speciesvirginica
# 1.462 4.260 5.552
iris.alt <- iris
iris.alt$Species <- as.character(iris.alt$Species)
lm(Petal.Length ~ -1 + Species, data=iris.alt)
# Call:
# lm(formula = Petal.Length ~ -1 + Species, data = iris.alt)
# Coefficients:
# Speciessetosa Speciesversicolor Speciesvirginica
# 1.462 4.260 5.552
Komunikat ostrzegawczy: W model.matrix.default(mt, mf, contrasts)
:
zmienna Species
przekonwertowana nafactor
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:
s <- iris$Species
s[s == 'setosa', drop=TRUE]
# [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa
s[s == 'setosa', drop=FALSE]
# [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa versicolor virginica
Jednak w przypadku data.frame
s zachowanie [.data.frame()
jest inne: zobacz tego e-maila lub ?"[.data.frame"
. Używanie drop=TRUE
na data.frame
s nie działa tak, jak można sobie wyobrazić:
x <- subset(iris, Species == 'setosa', drop=TRUE) # susbetting with [ behaves the same way
x$Species
# [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa versicolor virginica
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 a data.frame
(od R 2.12):
x <- subset(iris, Species == 'setosa')
levels(x$Species)
# [1] "setosa" "versicolor" "virginica"
x <- droplevels(x)
levels(x$Species)
# [1] "setosa"
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 (zobacz attributes(iris$Species)
i class(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 przypadku ggplot
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.