Как преобразовать все факторные переменные в числовые c переменные в большом кадре данных без потери меток переменных? - PullRequest
2 голосов
/ 11 марта 2020

Я пытаюсь преобразовать все факторные переменные в числовые c переменные в большом кадре данных. При преобразовании метки переменных (подробное название переменных) теряются в новом фрейме данных. Есть ли простой способ преобразовать факторные переменные в числовые c переменные в фрейме данных без потери переменной. Пример кода приведен ниже. Спасибо.

v1 <- c('1','4','5')
v2 <- c('21000', '23400', '26800')
v3 <- c('2010','2008','2007')
data <- data.frame(v1, v2, v3)
library(Hmisc)
label(data$v1) <- "Number"
label (data$v2) <- "Value"
label (data$v3) <- "Year"

data[] <- as.numeric(factor(as.matrix(data)))
View(data)

1 Ответ

1 голос
/ 11 марта 2020

Можно заранее сохранить атрибуты и восстановить их.

## save labels
attr.data <- lapply(dat, attr, "label")  

## convert to numeric and restore labels
dat[] <- Map(function(x, y) `attr<-`(as.numeric(levels(x))[x], "label", y), dat, attr.data)

За один шаг:

dat[] <- Map(function(x, y) 
  `attr<-`(as.numeric(levels(x))[x], "label", y), dat, Map(attr, dat, "label"))

Пояснение

Метки хранятся в атрибутах (попробуйте attributes(data)) и могут быть доступны с attr и их именами. Имя атрибута метки "label", и мы можем перехватить его во время преобразования. Map обрабатывает столбцы и атрибуты соответствующим образом, чтобы обеспечить назначение правильных меток.

Результат

dat
#   v1    v2   v3
# 1  1 21000 2010
# 2  4 23400 2008
# 3  5 26800 2007

str(dat)
# 'data.frame': 3 obs. of  3 variables:
#   $ v1: num  1 4 5
# ..- attr(*, "label")= chr "Number"
# $ v2: num  21000 23400 26800
# ..- attr(*, "label")= chr "Value"
# $ v3: num  2010 2008 2007
# ..- attr(*, "label")= chr "Year"

Данные

dat <- structure(list(v1 = structure(1:3, .Label = c("1", "4", "5"), class = c("labelled", 
"factor"), label = "Number"), v2 = structure(1:3, .Label = c("21000", 
"23400", "26800"), class = c("labelled", "factor"), label = "Value"), 
    v3 = structure(3:1, .Label = c("2007", "2008", "2010"), class = c("labelled", 
    "factor"), label = "Year")), row.names = c(NA, -3L), class = "data.frame")

Sidenote: Я использую dat вместо data здесь, потому что data уже занят из R для загрузки указанных c наборов данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...