Nhầm lẫn giữa các mức yếu tố và nhãn yếu tố


106

Dường như có sự khác biệt giữa các mức và nhãn của một yếu tố trong R. Cho đến nay, tôi luôn nghĩ rằng các mức là tên 'thực' của các mức nhân tố và nhãn là tên được sử dụng cho đầu ra (chẳng hạn như bảng và biểu đồ) . Rõ ràng, đây không phải là trường hợp, như ví dụ sau cho thấy:

df <- data.frame(v=c(1,2,3),f=c('a','b','c'))
str(df)
'data.frame':   3 obs. of  2 variables:
 $ v: num  1 2 3
 $ f: Factor w/ 3 levels "a","b","c": 1 2 3

df$f <- factor(df$f, levels=c('a','b','c'),
  labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX'))
levels(df$f)
[1] "Treatment A: XYZ" "Treatment B: YZX" "Treatment C: ZYX"

Tôi nghĩ rằng các cấp ('a', 'b', 'c') bằng cách nào đó vẫn có thể được truy cập khi viết script, nhưng điều này không hoạt động:

> df$f=='a'
[1] FALSE FALSE FALSE

Nhưng điều này không:

> df$f=='Treatment A: XYZ' 
[1]  TRUE FALSE FALSE

Vì vậy, câu hỏi của tôi bao gồm hai phần:

  • Sự khác biệt giữa các cấp và nhãn là gì?

  • Có thể có các tên khác nhau cho các mức yếu tố cho tập lệnh và đầu ra không?

Thông tin cơ bản: Đối với các kịch bản dài hơn, viết kịch bản với các cấp độ yếu tố ngắn có vẻ dễ dàng hơn nhiều. Tuy nhiên, đối với các báo cáo và biểu đồ, các mức hệ số ngắn này có thể không đủ và cần được thay thế bằng các tên tiền kiểm tra.

Câu trả lời:


131

Rất ngắn gọn: các mức là đầu vào, nhãn là đầu ra trong factor()hàm. Yếu tố chỉ có một levelthuộc tính, được đặt bởi labelsđối số trong factor()hàm. Điều này khác với khái niệm nhãn trong các gói thống kê như SPSS, và có thể gây nhầm lẫn trong thời gian đầu.

Những gì bạn làm trong dòng mã này

df$f <- factor(df$f, levels=c('a','b','c'),
  labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX'))

nói với R rằng có một vectơ df$f

  • mà bạn muốn chuyển đổi thành một yếu tố,
  • trong đó các cấp độ khác nhau được mã hóa là a, b và c
  • và bạn muốn các cấp độ được dán nhãn là Điều trị A, v.v.

Hàm nhân tố sẽ tìm kiếm các giá trị a, b và c, chuyển đổi chúng thành các lớp nhân tố số và thêm các giá trị nhãn vào levelthuộc tính của nhân tố. Thuộc tính này được sử dụng để chuyển đổi các giá trị số bên trong thành các nhãn chính xác. Nhưng như bạn thấy, không có labelthuộc tính.

> df <- data.frame(v=c(1,2,3),f=c('a','b','c'))    
> attributes(df$f)
$levels
[1] "a" "b" "c"

$class
[1] "factor"

> df$f <- factor(df$f, levels=c('a','b','c'),
+   labels=c('Treatment A: XYZ','Treatment B: YZX','Treatment C: ZYX'))    
> attributes(df$f)
$levels
[1] "Treatment A: XYZ" "Treatment B: YZX" "Treatment C: ZYX"

$class
[1] "factor"

1
Cảm ơn vì câu trả lời nhanh! Tôi đoán bây giờ tôi đã hiểu mục đích của các cấp và nhãn. Có thể có bất kỳ đề xuất nào để giúp con người có thể đọc được đầu ra tốt hơn mà không cần chỉnh sửa thủ công tên bảng và truyền thuyết cốt truyện?
donodarazao

6
Tôi thường chuyển đổi các cấp độ ngay trước khi vẽ / tạo nhãn, ví dụ: giữ nguyên các cấp độ là "a", "b", "c" trong khi thao tác, sau đó sử dụng cấp độ (f) <- paste ("Xử lý", toupper (cấp độ ( f)), sep = "") [hoặc cái gì đó] khi âm mưu. Hoặc tạo một yếu tố f_pretty song song mà bạn mang theo và sử dụng chỉ cho sản lượng ...
Bến Bolker

Tôi đã nghĩ về cả hai, nhưng cả hai phương pháp đều có nhược điểm. Cách đầu tiên có thể trở nên tẻ nhạt khi vẽ một số lượng lớn các biểu đồ và cách thứ hai có thể trở nên tẻ nhạt khi có nhiều tổng hợp dữ liệu liên quan đến việc viết kịch bản. Nhưng dường như không có cách nào để tránh điều đó một cách dễ dàng, vì vậy tôi sẽ đi theo gợi ý của bạn. :)
donodarazao

@ 42- Tôi không chắc ý bạn với "giá trị số". Nếu bạn muốn nói đến các giá trị nội tại trong yếu tố thì đó chính xác là những gì tôi đã nói ở trên. Do đó đề cập đến các giá trị số bên trong . Nếu bạn chỉ định levelsđối số, bạn cung cấp các giá trị trong đầu vào phải được khớp với labelsđối số. R giữ các nhãn (như thuộc tính levelsvà có sự nhầm lẫn) và lưu trữ các mã số nguyên bên trong. Các mã số nguyên này không liên quan gì đến các giá trị ban đầu, cho dù chúng là loại nào. tôi nghĩ bạn đã hiểu lầm tôi.
Joris Meys

Xin lỗi. Những gì bạn viết cũng là sự hiểu biết của tôi, và bây giờ tôi đang đọc lại câu hỏi của bạn, tôi không thể thấy nơi tôi nghĩ bạn đã nói khác. Tôi sẽ xóa bình luận của mình vì nó chỉ thêm ít hơn không có gì.
IRTFM

17

Tôi đã viết một gói "lfactors" cho phép bạn tham chiếu đến các cấp hoặc nhãn.

# packages
install.packages("lfactors")
require(lfactors)

flips <- lfactor(c(0,1,1,0,0,1), levels=0:1, labels=c("Tails", "Heads"))
# Tails can now be referred to as, "Tails" or 0
# These two lines return the same result
flips == "Tails"
#[1]  TRUE FALSE FALSE  TRUE  TRUE FALSE
flips == 0 
#[1]  TRUE FALSE FALSE  TRUE  TRUE FALSE

Lưu ý rằng lfactor yêu cầu các mức phải là số để chúng không bị nhầm lẫn với các nhãn.


3
đây là một gói tốt và cảm ơn vì đã đăng về nó (và viết nó). Có vẻ như loại chức năng nên có nguồn gốc từ các yếu tố R - thật tuyệt khi thấy một gói cung cấp loại ánh xạ cặp tên-giá trị này với các kiểm tra tương đương được tích hợp sẵn.
Soren
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.