Đây là một cách sử dụng switch
câu lệnh:
df <- data.frame(name = c('cow','pig','eagle','pigeon'),
stringsAsFactors = FALSE)
df$type <- sapply(df$name, switch,
cow = 'animal',
pig = 'animal',
eagle = 'bird',
pigeon = 'bird')
> df
name type
1 cow animal
2 pig animal
3 eagle bird
4 pigeon bird
Một nhược điểm của điều này là bạn phải tiếp tục viết tên danh mục ( animal
, v.v.) cho mỗi mục. Sẽ thuận tiện hơn về mặt cú pháp khi có thể xác định các danh mục của chúng tôi như bên dưới (xem câu hỏi tương tự Làm cách nào để thêm một cột trong khung dữ liệu trong R )
myMap <- list(animal = c('cow', 'pig'), bird = c('eagle', 'pigeon'))
và chúng tôi muốn bằng cách nào đó "đảo ngược" ánh xạ này. Tôi viết hàm invMap của riêng mình:
invMap <- function(map) {
items <- as.character( unlist(map) )
nams <- unlist(Map(rep, names(map), sapply(map, length)))
names(nams) <- items
nams
}
và sau đó đảo ngược bản đồ trên như sau:
> invMap(myMap)
cow pig eagle pigeon
"animal" "animal" "bird" "bird"
Và sau đó, thật dễ dàng sử dụng điều này để thêm type
cột vào khung dữ liệu:
df <- transform(df, type = invMap(myMap)[name])
> df
name type
1 cow animal
2 pig animal
3 eagle bird
4 pigeon bird
dput()
b) Bạn có muốn một giải pháp trong cơ sở R, dplyr, data.table, slimverse ... không?