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.table
và read.csv
, lập luận stringsAsFactors = TRUE
theo 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. ggplot
và 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 Species
chuyển đổi thànhfactor
Một điều khó khăn là toàn bộ drop=TRUE
bit. 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.frame
s, hành vi của lại [.data.frame()
khác: xem email này hoặc ?"[.data.frame"
. Sử dụng drop=TRUE
trên data.frame
s 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 ggplot
truyền thuyết.
Bên trong, factor
s 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 ggplot
huyề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.