R语言操作CSV文件:如何将长格式男女年龄数据拆分为两个独立列
R语言长格式性别年龄数据转宽格式实现方案
现有体量较大的CSV数据集采用长格式存储性别与对应年龄数据,需转换为宽格式,拆分出男性年龄、女性年龄两个独立列。原数据示例结构如下:
Sex Age M 18 F 20 M 65 F 36 M 49 M 27 F 38
方法1:tidyverse 实现(可读性高,适配常规场景)
该方法依赖tidyverse生态工具,代码逻辑清晰易维护:
# 加载依赖包 library(tidyverse) # 读取CSV源数据 df <- read_csv("你的数据文件路径.csv") # 执行长转宽操作 df_wide <- df %>% # 按性别分组生成组内行号,避免转宽时数据折叠 group_by(Sex) %>% mutate(grp_id = row_number()) %>% ungroup() %>% pivot_wider( names_from = Sex, values_from = Age, names_prefix = "年龄_" ) %>% # 删除辅助生成的分组id列 select(-grp_id)
处理完成后将得到年龄_M(男性年龄)、年龄_F(女性年龄)两列,长度不一致的部分自动填充为NA。
方法2:基础R实现(无需第三方依赖)
如果运行环境不允许安装额外包,可使用基础R语法实现:
# 读取CSV源数据 df <- read.csv("你的数据文件路径.csv") # 按性别分别提取年龄向量 male_age <- df$Age[df$Sex == "M"] female_age <- df$Age[df$Sex == "F"] # 统一两个向量的长度,较短的向量末尾补NA max_len <- max(length(male_age), length(female_age)) length(male_age) <- max_len length(female_age) <- max_len # 合并为宽格式数据框 df_wide <- data.frame( 男性年龄 = male_age, 女性年龄 = female_age )
大体量数据优化方案
如果数据量超过100万行,推荐使用data.table包处理,运算效率远高于前两种方案:
library(data.table) # 快速读取大体积CSV dt <- fread("你的数据文件路径.csv") # 长转宽处理 dt_wide <- dcast(dt, rowid(Sex) ~ Sex, value.var = "Age")[, Sex := NULL] # 重命名为中文列名 setnames(dt_wide, old = c("M", "F"), new = c("男性年龄", "女性年龄"))
内容的提问来源于stack exchange,提问作者Suman Jai
相关产品推荐
相关产品推荐

