使用 haven::labelled 动态创建值标签,跟进
Dynamically create value labels with haven::labelled, follow-up
, where akrun 的后续问题使用 deframe
提供了一个很好的答案。
我正在使用 haven::labelled 设置变量的值标签。目标是创建一个完整记录的数据集,我可以将其导出到 SPSS。
现在,假设我有一个 df value_labels
值及其值标签。我还有一个 df df_data
,其中包含我要为其分配值标签的变量。
value_labels <- tibble(
value = c(seq(1:6), seq(1:3), NA),
labels = c(paste0("value", 1:6),paste0("value", 1:3), NA),
name = c(rep("var1", 6), rep("var2", 3), "var3")
)
df_data <- tibble(
id = 1:10,
var1 = floor(runif(10, 1, 7)),
var2 = floor(runif(10, 1, 4)),
var3 = rep("string", 10)
)
我会手动为 df_data$var1
和 df_data$var2
创建值标签,如下所示:
df_data$var1 <- haven::labelled(df_data$var, labels = c(values1 = 1, values2 = 2, values3 = 3, values4 = 4, values5 = 5, values6 = 6))
df_data$var2 <- haven::labelled(df_data$var, labels = c(values1 = 1, values2 = 2, values3 = 3))
我需要一种更动态的方式来为大型数据集中的正确变量分配正确的值标签。该解决方案还需要忽略 character
向量,因为我不希望这些向量具有值标签。因此,value_labels
中的 var3
被列为 NA
。
解决方案不需要处理列表中的多个数据集。
这是一个选项,在删除 NA
行后,我们 split
由 'name' 命名的 'value/labels',使用 list
的名称对 'df_data' 的列进行子集化,应用 labelled
并将其分配回相同的列
lbls2 <- na.omit(value_labels)
lstLbls <- with(lbls2, split(setNames(value, labels), name))
df_data[names(lstLbls)] <- Map(haven::labelled,
df_data[names(lstLbls)], labels = lstLbls)
df_data
# A tibble: 10 x 4
# id var1 var2 var3
# <int> <dbl+lbl> <dbl+lbl> <chr>
# 1 1 2 [value2] 2 [value2] string
# 2 2 5 [value5] 2 [value2] string
# 3 3 4 [value4] 1 [value1] string
# 4 4 1 [value1] 2 [value2] string
# 5 5 1 [value1] 1 [value1] string
# 6 6 6 [value6] 2 [value2] string
# 7 7 1 [value1] 3 [value3] string
# 8 8 1 [value1] 1 [value1] string
# 9 9 3 [value3] 3 [value3] string
#10 10 6 [value6] 1 [value1] string
deframe
提供了一个很好的答案。
我正在使用 haven::labelled 设置变量的值标签。目标是创建一个完整记录的数据集,我可以将其导出到 SPSS。
现在,假设我有一个 df value_labels
值及其值标签。我还有一个 df df_data
,其中包含我要为其分配值标签的变量。
value_labels <- tibble(
value = c(seq(1:6), seq(1:3), NA),
labels = c(paste0("value", 1:6),paste0("value", 1:3), NA),
name = c(rep("var1", 6), rep("var2", 3), "var3")
)
df_data <- tibble(
id = 1:10,
var1 = floor(runif(10, 1, 7)),
var2 = floor(runif(10, 1, 4)),
var3 = rep("string", 10)
)
我会手动为 df_data$var1
和 df_data$var2
创建值标签,如下所示:
df_data$var1 <- haven::labelled(df_data$var, labels = c(values1 = 1, values2 = 2, values3 = 3, values4 = 4, values5 = 5, values6 = 6))
df_data$var2 <- haven::labelled(df_data$var, labels = c(values1 = 1, values2 = 2, values3 = 3))
我需要一种更动态的方式来为大型数据集中的正确变量分配正确的值标签。该解决方案还需要忽略 character
向量,因为我不希望这些向量具有值标签。因此,value_labels
中的 var3
被列为 NA
。
解决方案不需要处理列表中的多个数据集。
这是一个选项,在删除 NA
行后,我们 split
由 'name' 命名的 'value/labels',使用 list
的名称对 'df_data' 的列进行子集化,应用 labelled
并将其分配回相同的列
lbls2 <- na.omit(value_labels)
lstLbls <- with(lbls2, split(setNames(value, labels), name))
df_data[names(lstLbls)] <- Map(haven::labelled,
df_data[names(lstLbls)], labels = lstLbls)
df_data
# A tibble: 10 x 4
# id var1 var2 var3
# <int> <dbl+lbl> <dbl+lbl> <chr>
# 1 1 2 [value2] 2 [value2] string
# 2 2 5 [value5] 2 [value2] string
# 3 3 4 [value4] 1 [value1] string
# 4 4 1 [value1] 2 [value2] string
# 5 5 1 [value1] 1 [value1] string
# 6 6 6 [value6] 2 [value2] string
# 7 7 1 [value1] 3 [value3] string
# 8 8 1 [value1] 1 [value1] string
# 9 9 3 [value3] 3 [value3] string
#10 10 6 [value6] 1 [value1] string