2012-02-27 39 views
5

Tôi có data.frame chứa nhiều yếu tố và tôi muốn đổi tên các mức hệ số cho tất cả các yếu tố này. Ví dụ:Cách ấn định trong gia đình?

mydf <- data.frame(col1 = as.factor(c("A","A",NA,NA)),col2 = as.factor(c("A",NA,NA,"A"))) 
mydf <- as.data.frame(lapply(mydf,addNA)) 

Lưu ý rằng ví dụ thực tế đời sống không chỉ có hai cột. Do đó tôi muốn sử dụng áp dụng đối với chuyển nhượng tên mức khác cho tất cả các cột này, giống như trong:

levels(mydf$col1) <- c("1","0") 

Tôi đã thử các sau đây nhưng nó đã không làm việc ...

apply(mydf,1,function(x) levels(x) <- c("1","0")) 

Tôi không thực sự ngạc nhiên khi nó không hoạt động nhưng bây giờ tôi không có ý tưởng nào tốt hơn. Tôi có nên sử dụng with không?

EDIT: Tôi nhận ra rằng tôi đã phạm sai lầm ở đây bằng cách đơn giản hóa mọi thứ. Tôi đã sử dụng addNA để giải thích sự thật, rằng NA không nên xử lý như NA nữa. Vì vậy, tôi cũng muốn gắn nhãn lại chúng. Điều này không phù hợp với đề xuất của Andrie và trả về thông báo lỗi sau:

labels = c("1", : invalid labels; length 2 should be 1 or 1 

Lưu ý rằng tôi đã cập nhật ví dụ df của mình.

+0

Bạn không nói những gì bạn muốn làm với các cấp NA. Đổi tên chúng thành cái gì? – Andrie

+0

sau khi sử dụng addNA Tôi có cấp 1 và . Và tôi muốn đổi tên NA thành 0 - giống như họ là các yếu tố thông thường và chưa bao giờ là NA. –

+0

@Charles: có gì sai với thẻ phân loại? Đây là một câu hỏi nghiêm túc. Có phải vì nó quá bất khả tri về ngôn ngữ? Sử dụng thuật ngữ R cho danh mục ('factor') sẽ không tốt hơn. Tôi có nên để toàn bộ khía cạnh ra ngoài và tại sao? –

Trả lời

8

Bạn có thể thay đổi cấp theo tham chiếu bằng cách sử dụng setattr() từ gói bit hoặc data.table. Điều này tránh việc sao chép toàn bộ dữ liệu, và kể từ khi bạn nói rằng bạn có rất nhiều cột ...

require(bit)   # Either package 
require(data.table) # 
setattr(mydf[[1]],"levels",c("1","0")) 
setattr(mydf[[2]],"levels",c("1","0")) 

Điều đó có thể được thực hiện trong một for vòng lặp đơn giản mà là rất nhanh. Trách nhiệm của bạn là đảm bảo rằng bạn thay thế các vectơ mức với một vectơ có cùng độ dài, nếu không thì hệ số này có thể không còn giá trị nữa. Và, bạn phải thay thế toàn bộ mức vector bằng phương pháp này. Có một cách nội bộ trong data.table để thay thế các tên cấp cụ thể bằng cách tham chiếu, nhưng có lẽ không cần phải đi xa đến vậy.

+1

Tại sao không phải 'attr (mydf [[1]]," cấp độ ") <- c (" 1 "," 0 ")' hoặc 'cấp độ (mydf [[1]]) <- c (" 1 "," 0 ")'? –

+2

@Joshua 'tracemem (mydf)' trước tiên, xem 4 bản sao (của đối tượng _whole_). Giữ 'tracemem' trên sau đó thử' setattr() ': không có bản sao nào cả. Sau đó, cho 'mydf' 1 tỷ hàng và xem những người khác thất bại với' ra khỏi bộ nhớ', khi 'setattr()' hoạt động tốt (và nhanh chóng). –

+0

Ah, tất nhiên, bởi vì bạn đang làm mất dữ liệu.frame. Các thử nghiệm của tôi trên một véc tơ đơn lẻ không tạo ra các bản sao. Cảm ơn bạn đã làm rõ. –

Các vấn đề liên quan