Как получить обратно помеченные данные spss, преобразованные с помощью as_factor в R - PullRequest
0 голосов
/ 26 мая 2020

Я работаю с данными SPSS в R. Чтобы изменить / добавить данные из разных файлов, мне пришлось преобразовать данные в коэффициент (метод as_factor (x, levels = "both")). Теперь мне нужно записать данные обратно в файл .SAV, но я не могу преобразовать свои факторные переменные в помеченные данные. См. Ниже фрагмент кода: -

x <- labelled(sample(5, 10, replace = TRUE), c(Bad = 1, Good = 5))
x1<-as_factor(x, levels = "both")
x2<-labelled(x1)

Error: `x` must be a numeric or a character vector

Есть ли способ преобразовать данные SPSS из факторов.

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Это немного беспорядочно, но это работает для небольшого примера, который вы привели (не уверен, как это будет 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().

0 голосов
/ 26 мая 2020

Да, используя to_labelled(x1):

library(tidyverse)
library(labelled)

> x <- labelled(sample(5, 10, replace = TRUE), c(Bad = 1, Good = 5))
> str(x)
'haven_labelled' int [1:10] 2 4 3 1 5 5 2 5 5 5
- attr(*, "labels")= Named num [1:2] 1 5
 ..- attr(*, "names")= chr [1:2] "Bad" "Good"

> x1 <- to_factor(x, levels = "labels")
> str(x1)
Factor w/ 5 levels "Bad","2","3",..: 2 4 3 1 5 5 2 5 5 5

> x2 <- to_labelled(x1)
> str(x2)
'haven_labelled' num [1:10] 2 4 3 1 5 5 2 5 5 5
- attr(*, "labels")= Named int [1:5] 1 2 3 4 5
 ..- attr(*, "names")= chr [1:5] "Bad" "2" "3" "4" ...
...