将 sjlabelled::set_labels 用于查找 table

Use sjlabelled::set_labels with lookup table

我需要用 sjlabelled::set_labels 标记很多变量中的值。这是一个可重现的例子和已经有效的例子:

library(data.table)
library(sjlabelled)

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

data <- data.table(q1 = sample(1:3, 10, replace = TRUE),
                   q2 = sample(1:3, 10, replace = TRUE),
                   q3 = sample(1:3, 10, replace = TRUE),
                   q4 = sample(1:3, 10, replace = TRUE),
                   q5 = sample(1:3, 10, 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"