如何在R中基于现有数据表创建男女得分分列存储的新表
R实现长表转性别分列宽表方案
以下两种方案均可以实现需求,你可以根据使用习惯选择:
前置准备:示例原始数据(可替换为你的实际数据表)
df <- data.frame(gender = rep(c("male", "female"), c(3,2)), score = c(85,92,78,95,88))
方法1:使用tidyverse生态(dplyr + tidyr,适合习惯tidy语法的用户)
- 先加载依赖包
library(tidyverse) - 执行转换代码
new_df <- df %>% # 按性别分组 group_by(gender) %>% # 为每个性别内的得分生成顺序编号,用于后续对齐行数 mutate(row_id = row_number()) %>% # 把gender列的取值转为新列名,score作为对应列的值 pivot_wider(names_from = gender, values_from = score) %>% # 删除用于对齐的辅助编号列 select(-row_id)
注:如果男女样本数量不一致,样本更少的列空缺位置会自动填充NA
方法2:base R原生实现(无需安装额外包)
# 按性别拆分得分到独立向量 score_list <- split(df$score, df$gender) # 取两个性别最大的样本数作为新表行数 max_len <- max(lengths(score_list)) # 初始化新表 new_df <- data.frame( male = rep(NA, max_len), female = rep(NA, max_len) ) # 填充对应性别的得分 new_df$male[1:length(score_list$male)] <- score_list$male new_df$female[1:length(score_list$female)] <- score_list$female
小提示:如果你的数据中男女样本数量完全一致,可以用更简洁的写法:
new_df <- data.frame(male = df$score[df$gender == "male"], female = df$score[df$gender == "female"])
结果验证
执行head(new_df)即可查看生成的新表结构,确认符合要求。
内容的提问来源于stack exchange,提问作者Lilach
相关产品推荐
相关产品推荐

