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.tablei read.csvargument stringsAsFactors = TRUEdomyś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. ggplota 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 Speciesprzekonwertowana 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.frames zachowanie [.data.frame()jest inne: zobacz tego e-maila lub ?"[.data.frame". Używanie drop=TRUEna data.frames 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ę ggplotlegend.
Wewnętrznie factors 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 ggplotlegend. Jeśli sfałszujesz czynniki za pomocą wektorów znaków, istnieje ryzyko, że zmienisz tylko jeden element i przypadkowo utworzysz oddzielny nowy poziom.