4

これは、この質問のフォローアップ質問であり、最初はこの質問に触発されましたが、まったく同じではありません。

これが私の状況です。まず、データベースからデータを取得します。

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

第二に、私は職業コードに関する人間が読める情報を含むキーテーブルを引き出します。

profession.codes <- data.frame(profession.code = c(1,2,3,4,5),
                               profession.label = c('Optometrists',
                               'Accountants', 'Veterinarians', 
                               'Financial analysts',  'Nurses'))                 
   profession.codes
#  profession.code   profession.label
#               1       Optometrists
#               2        Accountants
#               3      Veterinarians
#               4 Financial analysts
#               5             Nurses

professionさて、私は自分の変数をdfからのラベルで上書きしたいと思いますprofession.codes。できればパッケージから使用joinplyrますが、私はどんな賢い解決策にもオープンです。私はそのプライが好きですが、xの順序を保持します。

私は現在このようにしています、

# install.packages('plyr', dependencies = TRUE)
library(plyr)

profession.codes$profession <- profession.codes$profession.code
df <- join(df, profession.codes, by="profession")
# levels(df$profession.label)
df$profession.label <- factor(df$profession.label, 
   levels = c(levels(df$profession.label), 
   setdiff(df$profession, df$profession.code)))
# levels(df$profession.label)
df$profession.label[df$profession==0 ] <- 0
df$profession.code <- NULL
df$profession  <- NULL
names(df) <- c("id", "profession")
df
#  id         profession
#  1       Optometrists
#  2             Nurses
#  3 Financial analysts
#  4               <NA>
#  5                  0
#  6             Nurses

これは、とprofessionを失うことなく上書きする方法です。NA0

問題は、0が17または任意の数である可能性があることであり、何らかの方法でそれを説明したいと思います。さらに、可能であればコードも短くしたいと思います。

どんな助けでも大歓迎です。

ありがとう、エリック

4

1 に答える 1

6

これは基本的なアプローチの1つです。

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

pc <- data.frame(profession.code = c(1,2,3,4,5),
                               profession.label = c('Optometrists',
                               'Accountants', 'Veterinarians', 
                               'Financial analysts',  'Nurses'))  


df$new <- as.character(pc[match(df$profession,  
    pc$profession.code), 'profession.label'])
df[is.na(df$new), 'new'] <- df[is.na(df$new), 'profession'] 
df$new <- as.factor(df$new)
df

どちらが得られますか:

  id profession                new
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
于 2012-04-15T01:00:32.537 に答える