将鱼类消费调查数据转为长格式并提取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
相关产品推荐
相关产品推荐

