将 sjlabelled::set_labels 与查找表一起使用

问题描述

我需要使用 sjlabelled::set_labels 标记许多变量中的值。这是一个可重现的示例以及已经有效的示例:

library(data.table)
library(sjlabelled)

lookup <- data.table(id = paste0("q",1:5),answers = paste(paste0("atext",paste0("btext",paste0("ctext",sep = ";"))

data <- data.table(q1 = sample(1:3,10,replace = TRUE),q2 = sample(1:3,q3 = sample(1:3,q4 = sample(1:3,q5 = sample(1:3,replace = TRUE))


data$q1 <- set_labels(data$q1,labels = unlist(strsplit(lookup[id == "q1",answers],split = ";")))

get_labels(data$q1)

因此,不同答案(=值)的标签由分号分隔。如果我通过 id 调用变量,我可以让它工作,但是正如您在示例代码中看到的那样,但是如果我想“循环”所有变量,我正在努力完成任务。

目标是能够将数据表(或数据框)导出为 SPSS 文件。如果它适用于其他软件包,我也会很高兴。

解决方法

data 的列名与 id 匹配,在 answers 上拆分 ; 并将标签作为列表传递。

library(sjlabelled)

data <- set_labels(data,labels = strsplit(lookup$answers[match(names(data),lookup$id)],';'))
get_labels(data)

#$q1
#[1] "atext1" "btext1" "ctext1"

#$q2
#[1] "atext2" "btext2" "ctext2"

#$q3
#[1] "atext3" "btext3" "ctext3"

#$q4
#[1] "atext4" "btext4" "ctext4"

#$q5
#[1] "atext5" "btext5" "ctext5"