Это немного беспорядочно, но это работает для небольшого примера, который вы привели (не уверен, как это будет go для ваших реальных данных). Первая проблема заключается в том, что уровни факторов, назначаемые as_factor
с опцией levels="both"
, довольно запутаны. Вы можете преобразовать в число c, а затем использовать labelled()
из пакета haven
, но это может привести к некоторой потере информации. Вместо этого я выбрал опцию levels="default"
и использовал функцию to_labelled()
из пакета labelled
. В этой функции я назначил метки для всех уровней факторов (а не только для двух меток, с которых вы начали), иначе они будут преобразованы в NA
.
Код:
library(haven)
library(labelled)
set.seed(617)
(x = labelled(sample(5, 10, replace = TRUE), c(Bad = 1, Good = 5)))
(x1 = as_factor(x, levels="default"))
(x2 = to_labelled(x1, labels=c(Bad = 1, '2'=2, '3'=3, '4'=4, Good = 5)))
Вывод:
> set.seed(617)
> (x = labelled(sample(5, 10, replace = TRUE), c(Bad = 1, Good = 5)))
<Labelled integer>
[1] 1 4 1 1 1 1 3 3 3 4
Labels:
value label
1 Bad
5 Good
> (x1 = as_factor(x, levels="default"))
[1] Bad 4 Bad Bad Bad Bad 3 3 3 4
Levels: Bad 3 4 Good
> (x2 = to_labelled(x1, labels=c(Bad = 1, '2'=2, '3'=3, '4'=4, Good = 5)))
<Labelled double>
[1] 1 4 1 1 1 1 3 3 3 4
Labels:
value label
1 Bad
2 2
3 3
4 4
5 Good
Это возвращает вас от фактора к размеченным данным. Если бы вам пришлось использовать опцию levels="both"
с as_factor()
, вы могли бы это сделать, но вам нужно будет убедиться, что вы правильно скопировали уровни факторов обратно в функцию to_labelled()
.