如何取回由 as_factor 在 R 中转换的标记 spss 数据
How to get labelled spss data back which is converted by as_factor in R
我正在 R 中处理 SPSS 数据。对于来自不同文件的 modify/append 数据,我必须将数据转换为因子 (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数据。
是的,使用 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" ...
这有点乱,但它适用于你给出的小例子(不确定它如何适用于你的真实数据)。第一个问题是由 as_factor
和 levels="both"
选项分配的因子水平非常混乱。您可以转换为数字,然后使用 haven
包中的 labelled()
,但这可能会导致一些信息丢失。相反,我所做的是选择 levels="default"
选项并使用 labelled
包中的 to_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()
函数。
我正在 R 中处理 SPSS 数据。对于来自不同文件的 modify/append 数据,我必须将数据转换为因子 (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数据。
是的,使用 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" ...
这有点乱,但它适用于你给出的小例子(不确定它如何适用于你的真实数据)。第一个问题是由 as_factor
和 levels="both"
选项分配的因子水平非常混乱。您可以转换为数字,然后使用 haven
包中的 labelled()
,但这可能会导致一些信息丢失。相反,我所做的是选择 levels="default"
选项并使用 labelled
包中的 to_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()
函数。