Можно заранее сохранить атрибуты и восстановить их.
## 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 наборов данных.