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


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

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

Nhưng điều này có:

> 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 nhau 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 kịch bản và đầu ra không?

Bối cảnh: Đối với các tập lệnh dài hơn, việc viết kịch bản với các mức 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à lô, các mức yếu tố ngắn này có thể không đầy đủ và phải được thay thế bằng các tên của trình đặt trước.


76
2018-05-03 12:37


gốc




Các câu trả lời:


Rất ngắn: các cấp là đầu vào, các nhãn là đầu ra trong factor() chức năng. Một yếu tố chỉ có một level thuộc tính, được thiết lập bởi labels đối số trong factor() chức năng. Đ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 ngay từ đầ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'))

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

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

Hàm yếu tố sẽ tì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 level thuộc tính của yếu tố. Thuộc tính này được sử dụng để chuyển đổi các giá trị số nội bộ thành các nhãn chính xác. Nhưng như bạn thấy, không có label thuộ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"

99
2018-05-03 12:48



Cảm ơn vì câu trả lời nhanh! Tôi đoán tôi hiểu mục đích của các cấp độ và nhãn hiện nay. Có lẽ bất kỳ đề xuất nào để làm cho sản lượng của con người có thể đọc được dễ dàng hơn nếu không tự chỉnh sửa tên bảng và truyền thuyết cốt truyện? - donodarazao
Tôi thường xuyên chuyển đổi các cấp ngay trước khi lập biểu đồ / tạo nhãn, ví dụ: giữ các mức như "a", "b", "c" trong khi thao tác, sau đó sử dụng các mức (f) <- paste ("Điều trị", toupper (các cấp (f)), sep = "") [hoặc cái gì đó] khi âm mưu. Hoặc tạo ra một yếu tố song song f_pretty mà bạn mang theo và chỉ sử dụng cho đầu ra ... - Ben Bolker
Tôi nghĩ về cả hai, nhưng cả hai phương pháp đều có nhược điểm. Việc đầu tiên có thể trở nên tẻ nhạt khi vẽ một số lượng lớn các đồ thị và thứ hai có thể trở nên tẻ nhạt khi nhiều tập hợp dữ liệu được tham gia vào kịch bản lệnh. Nhưng rõ ràng là không có cách nào để tránh điều đó dễ dàng, vì vậy tôi sẽ đi với đề xuất của bạn. :) - donodarazao
@ 42- Tôi không chắc chắn ý bạn là gì với "giá trị số". Nếu bạn có nghĩa là các giá trị bên trong trong các yếu tố thì đó là chính xác những gì tôi đã nói ở trên. Do đó việc đề cập đến nội bộ Giá trị kiểu số. Nếu bạn chỉ định levels đối số, bạn đưa ra các giá trị trong đầu vào phải khớp với labels tranh luận. R giữ các nhãn (như là thuộc tính levelsvà có sự nhầm lẫn) và lưu trữ mã số nguyên trong nội bộ. Các mã số nguyên này không có gì để làm với các giá trị ban đầu, bất kể chúng là gì. tôi nghĩ bạn đã hiểu lầm tôi. - Joris Meys
Xin lỗi. Những gì bạn viết là sự hiểu biết của tôi là tốt, và bây giờ tôi đang đọc lại câu hỏi của bạn, tôi không thể nhìn thấy nơi tôi nghĩ bạn nói khác nhau. Tôi sẽ xóa bình luận của tôi bởi vì nó thêm ít hơn không có gì. - 42-


Tôi đã viết một gói "lfactors" cho phép bạn tham khảo một trong hai 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 một lfactor yêu cầu các mức là số để chúng không thể bị nhầm lẫn với các nhãn.


7
2018-05-06 04:15