如何从数值列与字符标签列创建{haven}风格的<dbl+lbl>标签列?
如何创建{haven}包风格的<dbl+lbl>标签列
现有两列数据:一列是字符格式的数值(可转换为数值型),另一列是与数值一一对应的文本标签,需要生成类似{haven}包导入的<dbl+lbl>类型带标签的列。
示例数据
# 示例数据结构 df <- structure(list(cut_comuna = c("16303", "8301", "13111", "13201", "1101", "8110", "14204", "6101"), comuna = c("Ñiquén", "Los Angeles", "La Granja", "Puente Alto", "Iquique", "Talcahuano", "Río Bueno", "Rancagua")), row.names = c(NA, -8L), class = c("tbl_df", "tbl", "data.frame")) # 查看数据 df
运行后输出:
# A tibble: 8 × 2 cut_comuna comuna <chr> <chr> 1 16303 Ñiquén 2 8301 Los Angeles 3 13111 La Granja 4 13201 Puente Alto 5 1101 Iquique 6 8110 Talcahuano 7 14204 Río Bueno 8 6101 Rancagua
解决方案
核心是使用{haven}包的labelled()函数,步骤如下:
- 将字符格式的数值列转换为数值型
- 构建数值与标签的对应字典
- 用
labelled()函数将数值列与标签绑定
完整代码
# 加载所需包 library(haven) library(dplyr) # 生成<dbl+lbl>类型列 df <- df %>% mutate( comuna2 = labelled( # 转换数值类型 x = as.numeric(cut_comuna), # 构建标签映射:数值为键,文本标签为值 labels = setNames(comuna, as.numeric(cut_comuna)) ) ) # 查看结果 select(df, comuna2)
运行结果
# A tibble: 8 × 1 comuna2 <dbl+lbl> 1 16303 [Ñiquén] 2 8301 [Los Angeles] 3 13111 [La Granja] 4 13201 [Puente Alto] 5 1101 [Iquique] 6 8110 [Talcahuano] 7 14204 [Río Bueno] 8 6101 [Rancagua]
补充说明
- 生成的
<dbl+lbl>列支持{haven}包的所有相关操作:- 用
as_factor(comuna2)可将标签转为因子类型 - 用
print_labels(comuna2)可查看完整的数值-标签映射关系
- 用
- 如果不需要保留原列,可直接用
select(df, comuna2)筛选目标列
内容的提问来源于stack exchange,提问作者Bastián Olea Herrera
相关产品推荐
相关产品推荐

