Note câu trả lời này bắt đầu như là một nỗ lực để giải quyết vấn đề đơn giản hơn nhiều posted in How to replace all values in data frame with a vector of values?. Rất tiếc, câu hỏi này đã bị đóng là trùng lặp với câu hỏi thực tế. Vì vậy, tôi sẽ cố gắng đề xuất một giải pháp dựa trên các yếu tố thay thế cho cả hai trường hợp, tại đây.
Trong trường hợp chỉ có một vector (hoặc một dữ liệu khung cột) có giá trị cần phải được thay thế và không có sự phản đối sử dụng yếu tố chúng ta có thể ép buộc các vector đến yếu tố và thay đổi cấp độ yếu tố theo yêu cầu:
x <- c(1, 1, 4, 4, 5, 5, 1, 1, 2)
x <- factor(x)
x
#[1] 1 1 4 4 5 5 1 1 2
#Levels: 1 2 4 5
replacement_vec <- c("A", "T", "C", "G")
levels(x) <- replacement_vec
x
#[1] A A C C G G A A T
#Levels: A T C G
Sử dụng forcats
gói này có thể được thực hiện trong một lớp lót:
x <- c(1, 1, 4, 4, 5, 5, 1, 1, 2)
forcats::lvls_revalue(factor(x), replacement_vec)
#[1] A A C C G G A A T
#Levels: A T C G
Trong trường hợp tất cả giá trị của nhiều cột của một khung dữ liệu cần phải được thay thế, cách tiếp cận có thể được mở rộng.
foo <- data.frame(snp1 = c("AA", "AG", "AA", "AA"),
snp2 = c("AA", "AT", "AG", "AA"),
snp3 = c(NA, "GG", "GG", "GC"),
stringsAsFactors=FALSE)
level_vec <- c("AA", "AC", "AG", "AT", "GC", "GG")
replacement_vec <- c("0101", "0102", "0103", "0104", "0302", "0303")
foo[] <- lapply(foo, function(x) forcats::lvls_revalue(factor(x, levels = level_vec),
replacement_vec))
foo
# snp1 snp2 snp3
#1 0101 0101 <NA>
#2 0103 0104 0303
#3 0101 0103 0303
#4 0101 0101 0302
Lưu ý rằng level_vec
và replacement_vec
phải có độ dài bằng nhau.
Quan trọng hơn, level_vec
phải là hoàn thành, tức là bao gồm tất cả giá trị có thể có trong các cột bị ảnh hưởng của khung dữ liệu gốc. (Sử dụng unique(sort(unlist(foo)))
để xác minh). Nếu không, bất kỳ giá trị bị thiếu nào sẽ bị ép buộc là <NA>
. Lưu ý rằng đây cũng là yêu cầu cho Martin Morgans's answer.
Vì vậy, nếu chỉ có một vài giá trị khác nhau được thay thế, bạn có lẽ sẽ tốt hơn với một trong các câu trả lời khác, ví dụ: Ramnath's.
Từ điển của bạn có phải là danh sách R không? – Mark
Hiện tại, nhưng sẽ dễ dàng biến nó thành một. – Stedy
Có lẽ câu hỏi này có thể hữu ích: [Case Statement Equivalent] (http://stackoverflow.com/q/4622060/168747), [Cách thêm một cột vào một 'data.frame'] (http: // stackoverflow. com/q/4562547/168747), [Làm sạch dữ liệu trong trang tính Excel] (http://stackoverflow.com/q/7374314/168747). – Marek