从查找表为因子水平标注(使用labelled包)

编程语言 2026-07-12

我想自动为调查数据中在查找表里有对应水平和标签的所有变量添加标签。

下面是一组伪数据——我有一个名为dat的表存放原始数据,以及一个名为labels的表存放标签。

dummy_dat<- data.frame("X1"=c(1,2,1), "X2_1"=c(1,2,3), "X2_2"=c(3,2,1),"X3"=c(1,2,3))

dummy_labels <- data.frame(question = c("X1", "X2_1", "X2_2", "X3"),
  x1 = c("yes", "never", "never", NA),
  x2 = c("no", "sometimes", "sometimes", NA),
  x3 = c(NA, "always", "always", NA)
)

我尝试把labels表转换成长格式(melt),并把列名中的 "x" 去掉。

melt_dummylab<- reshape2::melt(dummy_labels,id.vars=c("question"))
melt_dummylab$variable<- gsub( "x", "", as.character(melt_dummylab$variable))

然后我尝试使用labelled包中的dictionary_to_value函数:

dic_test<- melt_dummylab %>% 
  dictionary_to_value_labels(names_from =question, values_from=variable ,labels_from = value, data=dummy_dat)

但之后我不知道该把它传给set_value_label。每次尝试都会得到错误:“.data 应该是一个数据框、一个调查设计对象,或一个向量。”

labelled<- set_value_labels(dic_test,labels = dic_test)

如果有人知道怎么修复,或者给出使用其他包的解法,甚至用基础R 实现也行。

解决方案

dictionary_to_value_labels() 返回一个带名称的标签定义列表;通过 !!! 将它插入到 set_value_labels() 上,以一次性为数据应用所有标签。

library(labelled)

dummy_dat_lab <- reshape2::melt(dummy_labels, id.vars = "question") |>
  transform(variable = as.numeric(gsub("x", "", variable))) |>
  na.omit() |>
  dictionary_to_value_labels(
    names_from = question,
    values_from = variable,
    labels_from = value,
    data = dummy_dat
  ) |>
  (\(dic) set_value_labels(dummy_dat, !!!dic))()

str(dummy_dat_lab)

#> 'data.frame':    3 obs. of  4 variables:
#>  $ X1  : dbl+lbl [1:3] 1, 2, 1
#>    ..@ labels: Named num  1 2
#>    .. ..- attr(*, "names")= chr [1:2] "yes" "no"
#>  $ X2_1: dbl+lbl [1:3] 1, 2, 3
#>    ..@ labels: Named num  1 2 3
#>    .. ..- attr(*, "names")= chr [1:3] "never" "sometimes" "always"
#>  $ X2_2: dbl+lbl [1:3] 3, 2, 1
#>    ..@ labels: Named num  1 2 3
#>    .. ..- attr(*, "names")= chr [1:3] "never" "sometimes" "always"
#>  $ X3  : num  1 2 3

创建于2026-02-27,使用 reprex v2.1.1

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章