You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从数值列与字符标签列创建{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()函数,步骤如下:

  1. 将字符格式的数值列转换为数值型
  2. 构建数值与标签的对应字典
  3. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 19:30:14