2012-04-03 33 views
8

Câu hỏi này có liên quan đến this question, nhưng không hoàn toàn giống nhau.làm cách nào để thay thế mã số bằng nhãn giá trị từ bảng tra cứu?

Nói rằng tôi có khung dữ liệu này,

df <- data.frame(
       id = c(1:6), 
       profession = c(1, 5, 4, NA, 0, 5)) 

và một chuỗi những thông tin có thể đọc được con người về các mã nghề. Nói,

profession.code <- c(
        Optometrists=1, Accountants=2, Veterinarians=3, 
        `Financial analysts`=4, Nurses=5) 

Bây giờ, tôi đang tìm cách dễ nhất để thay thế các giá trị trong df$profession với văn bản được tìm thấy trong profession.code. Tốt hơn là không sử dụng các thư viện đặc biệt, trừ khi nó rút ngắn mã đáng kể.

Tôi muốn kết quả cuối cùng của tôi là

df <- data.frame(
       id = c(1:6), 
       profession = c("Optometrists", "Nurses", 
       "Financial analysts", NA, 0, "Nurses")) 

Bất kỳ trợ giúp sẽ được đánh giá rất nhiều.

Cảm ơn, Eric

Trả lời

10

Bạn có thể làm theo cách này:

df <- data.frame(id = c(1:6), 
       profession = c(1, 5, 4, NA, 0, 5)) 

profession.code <- c(`0` = 0, Optometrists=1, Accountants=2, Veterinarians=3, 
        `Financial analysts`=4, Nurses=5) 

df$profession.str <- names(profession.code)[match(df$profession, profession.code)] 
df 
# id profession  profession.str 
# 1 1   1  Optometrists 
# 2 2   5    Nurses 
# 3 3   4 Financial analysts 
# 4 4   NA    <NA> 
# 5 5   0     0 
# 6 6   5    Nurses 

Lưu ý rằng tôi đã có thêm một mục 0 trong profession.code vector của bạn để giải thích cho những zero.

EDIT: đây là một giải pháp cập nhật để giải thích cho lời nhận xét của Eric dưới đây rằng các dữ liệu có thể chứa bất kỳ số lượng mã nghề mà không có giới thiệu tương ứng:

match.idx <- match(df$profession, profession.code) 
df$profession.str <- ifelse(is.na(match.idx), 
          df$profession, 
          names(profession.code)[match.idx]) 
+0

Cảm ơn bạn đã cung cấp giải pháp. Vấn đề của tôi là dữ liệu được truyền cho tôi từ một cơ sở dữ liệu, và đôi khi các số không mong muốn được gửi _back cho me_, vì vậy tôi có thể nhận được bất kỳ số nào, không chỉ 0. Tôi phải tính đến điều đó theo một cách nào đó. –

+0

Đó không phải là một vấn đề, tôi sẽ cung cấp một bản cập nhật. – flodel

3

tôi đã chơi đùa với nó và đây là giải pháp hiện tại của tôi bằng gói car.

pLoop <- function(v) paste(profession.code[v],"='", names(profession.code[v]),"';") 
library(car) 
df$profession<- recode(df$profession, paste(sapply(1:5, pLoop),collapse="")) 

df 
# id   profession 
# 1   Optometrists 
# 2    Nurses 
# 3 Financial analysts 
# 4     <NA> 
# 5     0 
# 6    Nurses 

Vẫn quan tâm đến việc có ai có đề xuất khác về giải pháp hay không. Tôi chỉ muốn sử dụng chức năng cơ bản trong R.

1

Cá nhân tôi thích cách gói arules giải quyết vấn đề này, sử dụng chức năng decode. Từ các tài liệu:

library(arules) 
data("Adult") 

## Example 1: Manual decoding 
## get code 
iLabels <- itemLabels(Adult) 
head(iLabels) 

## get undecoded list and decode in a second step 
list <- LIST(Adult[1:5], decode = FALSE) 
list 

decode(list, itemLabels = iLabels) 

Advantage là gói cũng cung cấp các chức năng encoderecode. Mục đích tương ứng của họ là đơn giản, tôi tin.

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