Đối phó với các thừa số trong R là một công việc khá đặc biệt, tôi phải thừa nhận rằng ... Trong khi sắp xếp lại các mức nhân tố, bạn không sắp xếp lại các giá trị số cơ bản. Đây là một minh chứng nhỏ:
> numbers = 1:4
> letters = factor(letters[1:4])
> dtf <- data.frame(numbers, letters)
> dtf
numbers letters
1 1 a
2 2 b
3 3 c
4 4 d
> sapply(dtf, class)
numbers letters
"integer" "factor"
Bây giờ, nếu bạn chuyển đổi hệ số này thành số, bạn sẽ nhận được:
# return underlying numerical values
1> with(dtf, as.numeric(letters))
[1] 1 2 3 4
# change levels
1> levels(dtf$letters) <- letters[4:1]
1> dtf
numbers letters
1 1 d
2 2 c
3 3 b
4 4 a
# return numerical values once again
1> with(dtf, as.numeric(letters))
[1] 1 2 3 4
Như bạn có thể thấy ... bằng cách thay đổi cấp độ, bạn chỉ thay đổi cấp độ (ai sẽ nói, hả?), Chứ không phải các giá trị số! Tuy nhiên, khi bạn sử dụng factor
hàm như @Jonathan Chang đề xuất, điều gì đó khác sẽ xảy ra: bạn tự thay đổi các giá trị số.
Bạn lại gặp lỗi một lần nữa do bạn làm levels
và sau đó cố gắng làm lại nó bằng factor
. Đừng làm vậy !!! Đừng không sử dụng levels
hoặc bạn sẽ điều lộn xộn lên (trừ khi bạn biết chính xác những gì bạn đang làm).
Một gợi ý: tránh đặt tên các đối tượng của bạn có tên giống với đối tượng của R ( df
là hàm mật độ cho phân phối F, letters
cho các chữ cái viết thường). Trong trường hợp cụ thể này, mã của bạn sẽ không bị lỗi, nhưng đôi khi nó có thể bị ... nhưng điều này có thể tạo ra sự nhầm lẫn và chúng tôi không muốn điều đó, phải không?!? =)
Thay vào đó, hãy sử dụng một cái gì đó như thế này (tôi sẽ làm lại từ đầu):
> dtf <- data.frame(f = 1:4, g = factor(letters[1:4]))
> dtf
f g
1 1 a
2 2 b
3 3 c
4 4 d
> with(dtf, as.numeric(g))
[1] 1 2 3 4
> dtf$g <- factor(dtf$g, levels = letters[4:1])
> dtf
f g
1 1 a
2 2 b
3 3 c
4 4 d
> with(dtf, as.numeric(g))
[1] 4 3 2 1
Lưu ý rằng bạn cũng có thể đặt tên cho bạn data.frame
bằngdf
và letters
thay vì g
, và kết quả sẽ là OK. Trên thực tế, mã này giống hệt với mã bạn đã đăng, chỉ có tên là thay đổi. Phần này factor(dtf$letter, levels = letters[4:1])
sẽ không gây ra lỗi, nhưng nó có thể gây nhầm lẫn!
Đọc ?factor
kỹ hướng dẫn sử dụng! Sự khác biệt giữa factor(g, levels = letters[4:1])
vàfactor(g, labels = letters[4:1])
gì? Có gì tương tự trong levels(g) <- letters[4:1]
và g <- factor(g, labels = letters[4:1])
?
Bạn có thể đặt cú pháp ggplot, để chúng tôi có thể giúp bạn nhiều hơn về cú pháp này!
Chúc mừng !!!
Biên tập:
ggplot2
thực sự yêu cầu thay đổi cả cấp độ và giá trị? Hừm ... Tôi sẽ đào cái này ra ...