Эффективное и универсальное перекодирование категориальных переменных в R - PullRequest
0 голосов
/ 29 мая 2018

Представьте себе data.table вот так

library(data.table)
DT = data.table(values=c('call', NA, 'letter', 'call', 'e-mail', 'phone'))
print(DT)

   values
1:   call
2:   <NA>
3: letter
4:   call
5: e-mail
6:  phone

Я хочу перекодировать значения следующим отображением

mappings = list(
  'by_phone' = c('call', 'phone'),
  'by_web' = c('e-mail', 'web-meeting')
)

То есть я хочу преобразовать call в by_phoneи т.д. NA должен быть установлен в missing, а неизвестный (согласно предоставленному отображению) - в other.Для этой конкретной таблицы данных я мог бы просто решить мою проблему следующим образом:

recode_group <- function(values, mappings){
  ifelse(values %in% unlist(mappings[1]), names(mappings)[1], 
         ifelse(values %in% unlist(mappings[2]), names(mappings)[2], 
                ifelse(is.na(values), 'missing', 'other')
         )
    )
}
DT[, recoded_group:=recode_group(values, mappings)]
print(DT)

   values recoded_group
1:   call      by_phone
2:   <NA>       missing
3: letter         other
4:   call      by_phone
5: e-mail        by_web
6:  phone      by_phone

Но я ищу эффективную и общую функциональность recode_group.Есть предложения?

1 Ответ

0 голосов
/ 29 мая 2018

Вот вариант с подходом к обновлению:

DT[stack(mappings), on = "values", recoded_group := ind]
DT[is.na(values), recoded_group := "missing"]

DT
#   values recoded_group
#1:   call      by_phone
#2:     NA       missing
#3: letter            NA
#4:   call      by_phone
#5: e-mail        by_web
#6:  phone      by_phone
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...