Search code examples
rlabelspssr-haven

Assign value labels as string values in R


Hello I imported a dataset from SPSS in R, the dataset has labels and I want to use value labels as string values. Is there a way to do it?

head(dataset$A7B1)
<Labelled double>: A7b1. Cantón de San José en que reside
[1] NA NA NA 2  8 NA 4 NA 5

Labels:
 value         label
     1      SAN JOSÉ
     2        ESCAZÚ
     3  DESAMPARADOS
     4      PURISCAL
     5       TARRAZÚ
     6        ASERRÍ
     7          MORA
     8    GOICOECHEA
     9     SANTA ANA
    10    ALAJUELITA
    11      CORONADO
    12        ACOSTA
    13         TIBAS
    14       MORAVIA
    15 MONTES DE OCA
    16    TURRUBARES
    17          DOTA
    18    CURRIDABAT
    19 PÉREZ ZELEDÓN
    20   LEÓN CORTÉS

I need that every double labelled value become a string value according to the value label.

glimpse(dataset)
Rows: 283
Columns: 9
$ A7A  <dbl+lbl> 2, 8, 3, 3, 1, 2, 4, 4, 4, 2, 2, 4, 3, 4, 2, 3, 1, 2, 2, 6, 1, 1, 2, 2, 1, 2, 3, 1, 2, 1, 1, 4, 3, 1, 2, 2, 1, 1, 4, ...
$ A7B1 <dbl+lbl> NA, NA, NA, NA, 8, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 3, NA, NA, NA, 1, 11, NA, NA, 8, NA, NA, 3, NA, 14, 1,...
$ A7B2 <dbl+lbl> 1, NA, NA, NA, NA, 1, NA, NA, NA, 1, 1, NA, NA, NA, 1, NA, NA, 6, 2, NA, NA, NA, 1, 10, NA, 1, NA, NA, 1, NA, NA, NA,...
$ A7B3 <dbl+lbl> NA, NA, 1, 7, NA, NA, NA, NA, NA, NA, NA, NA, 3, NA, NA, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, NA, NA...
$ A7B4 <dbl+lbl> NA, NA, NA, NA, NA, NA, 2, 1, 1, NA, NA, 9, NA, 7, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ A7B5 <dbl+lbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
$ A7B6 <dbl+lbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA...
$ A7B7 <dbl+lbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
$ A7B8 <dbl+lbl> NA, 1, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA..


 dput(head(dataset$A7A))
structure(c(2, 8, 3, 3, 1, 2), label = "A7a. Provincia de residencia", labels = c(`San Jose` = 1,     Alajuela = 2, Cartago = 3, Heredia = 4, Guanacaste = 5, Puntarenas = 6, 
Limon = 7, Extrenjero = 8), class = "haven_labelled")

Solution

  • I typically use haven when reading in SPSS data and have a helper function for this. Hope this helps--if it doesn't please provide more info in your question :)

    library(haven)
    
    swap_labels <- function(x, keep_original = TRUE) {
      
      labels <- attr(x, "labels")
      new_vec <- names(labels)[match(x, labels)]
      
      if(keep_original) {
        haven::labelled_spss(new_vec, setNames(names(labels), labels))
      } else {
        new_vec
      }
      
    }
    
    # Reproducible example
    test_vec <- labelled_spss(1:3, labels = setNames(1:3, letters[1:3]))
    
    > test_vec
    <labelled_spss<integer>[3]>
    [1] 1 2 3
    
    Labels:
     value label
         1     a
         2     b
         3     c
    
    > swap_labels(test_vec)
    <labelled_spss<character>[3]>
    [1] a b c
    
    Labels:
     value label
         a     1
         b     2
         c     3