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

将鱼类消费调查数据转为长格式并提取FishOptionNum列

问题描述

我正在分析一份鱼类消费调查数据集,原始数据代码如下:

Harbor <- c("Harbor1","Harbor1","Harbor2","Harbor2")
dfish01_correctname_s1 <- c("Anchovy", "Croaker","Anchovy","Mackerel")
dfish01_qty_s1 <- c(3,NA,24,2)
dfish02_correctname_s1 <- c("Croaker", "Herring","Shrimp","False trevally")
dfish02_qty_s1 <- c(22, 12, 3, NA)
dfish03_correctname_s1 <- c("Anchovy", "Croaker","Anchovy","Mackerel")
dfish03_qty_s1 <- c(10, 9, 5, 7)

fishData <- data.frame(Harbor, dfish01_correctname_s1, 
dfish01_qty_s1, dfish02_correctname_s1, dfish02_qty_s1, 
dfish03_correctname_s1, dfish03_qty_s1)

变量说明:

  • Harbor:调查地点名称
  • dfish01/dfish02/dfish03:受访者选择的鱼类选项,correctname为鱼类物种名称
  • qty:受访者报告的鱼类数量
  • s1:数据来自第一轮调查(另有两轮调查)

需求:将数据转换为长格式,并提取鱼类选项编号至名为FishOptionNum的独立列。


解决方案

可以使用tidyverse包中的pivot_longer()函数完成宽转长操作,同时通过正则表达式提取选项编号:

# 加载tidyverse包
library(tidyverse)

# 转换长格式并提取选项编号
fishData_long <- fishData %>%
  pivot_longer(
    cols = -Harbor,  # 保留Harbor列,将其余列转为长格式
    names_to = c("FishOptionNum", ".value", "SurveyRound"),  # 拆分列名到三个变量
    names_pattern = "dfish(\\d+)_(.*)_s(\\d+)"  # 正则匹配:提取选项编号、字段类型、调查轮次
  ) %>%
  rename(
    FishName = correctname,  # 重命名字段为更直观的名称
    Quantity = qty
  )

# 查看转换结果
print(fishData_long)

代码说明

  • names_pattern = "dfish(\\d+)_(.*)_s(\\d+)":用正则表达式拆分原列名:
    • (\\d+):提取dfish后的数字作为FishOptionNum
    • (.*):匹配correctname或qty部分,对应.value参数(保留原字段的属性)
    • (\\d+):提取s后的数字作为SurveyRound
  • .value参数:指定列名中对应位置的内容作为新数据框的列名,以此保留correctname和qty的字段结构
  • rename():调整列名,让结果更易读

输出示例

转换后的长格式数据结构如下:

# A tibble: 12 × 5
   Harbor  FishOptionNum SurveyRound FishName       Quantity
   <chr>   <chr>         <chr>       <chr>              <dbl>
 1 Harbor1 01            1           Anchovy               3
 2 Harbor1 01            1           Croaker              NA
 3 Harbor1 02            1           Croaker              22
 4 Harbor1 02            1           Herring              12
 5 Harbor1 03            1           Anchovy              10
 6 Harbor1 03            1           Croaker               9
 7 Harbor2 01            1           Anchovy              24
 8 Harbor2 01            1           Mackerel              2
 9 Harbor2 02            1           Shrimp                3
10 Harbor2 02            1           False trevally       NA
11 Harbor2 03            1           Anchovy               5
12 Harbor2 03            1           Mackerel              7

内容的提问来源于stack exchange,提问作者Prasanna S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 21:48:22