Bạn nên sử dụng các yếu tố. Đúng, chúng có thể là một nỗi đau, nhưng lý thuyết của tôi là 90% lý do tại sao chúng là một nỗi đau là vì read.tablevà read.csv, lập luận stringsAsFactors = TRUEtheo mặc định (và hầu hết người dùng đều bỏ lỡ sự tinh tế này). Tôi nói rằng chúng hữu ích vì các gói phù hợp mô hình như các yếu tố sử dụng lme4 và các yếu tố có thứ tự để phù hợp với các mô hình một cách khác biệt và xác định loại tương phản để sử dụng. Và các gói đồ thị cũng sử dụng chúng để nhóm theo. ggplotvà hầu hết các hàm điều chỉnh mô hình bắt buộc các vectơ ký tự với các yếu tố, vì vậy kết quả là giống nhau. Tuy nhiên, bạn sẽ nhận được cảnh báo trong mã của mình:
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
Thông báo cảnh báo: Trong model.matrix.default(mt, mf, contrasts):
biến được Specieschuyển đổi thànhfactor
Một điều khó khăn là toàn bộ drop=TRUEbit. Trong vectơ, điều này hoạt động tốt để loại bỏ các cấp độ của các yếu tố không có trong dữ liệu. Ví dụ:
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
Tuy nhiên , với data.frames, hành vi của lại [.data.frame()khác: xem email này hoặc ?"[.data.frame". Sử dụng drop=TRUEtrên data.frames không hoạt động như bạn tưởng tượng:
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
May mắn thay, bạn có thể loại bỏ các yếu tố một cách dễ dàng bằng droplevels()cách giảm các mức yếu tố không sử dụng cho một yếu tố riêng lẻ hoặc cho mọi yếu tố trong a data.frame(kể từ R 2,12):
x <- subset(iris, Species == 'setosa')
levels(x$Species)
# [1] "setosa" "versicolor" "virginica"
x <- droplevels(x)
levels(x$Species)
# [1] "setosa"
Đây là cách giữ cho các cấp độ bạn đã chọn không xuất hiện trong ggplottruyền thuyết.
Bên trong, factors là các số nguyên có vectơ ký tự cấp thuộc tính (xem attributes(iris$Species)và class(attributes(iris$Species)$levels)), là số nguyên. Nếu bạn phải thay đổi tên cấp (và bạn đang sử dụng chuỗi ký tự), đây sẽ là một hoạt động kém hiệu quả hơn nhiều . Và tôi thay đổi tên cấp độ rất nhiều, đặc biệt là cho các ggplothuyền thoại. Nếu bạn giả mạo các yếu tố bằng vectơ ký tự, có nguy cơ bạn chỉ thay đổi một yếu tố và vô tình tạo ra một cấp độ mới riêng biệt.