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

在R数据框中按Grade分组计算全职/兼职男性的平均薪资

R实现按Grade分组计算全职/兼职男性平均薪资(缺失补0)

步骤1:构造示例数据(可替换为你的实际数据集)

# 示例数据框,模拟你的原始数据
df <- tibble(
  genderTime = c("ftMale", "ptMale", "ptMale", "ptFemale", "ftFemale", 
                 "ftMale", "ptFemale", "ptFemale", "ptMale"),
  Salary = c(32000, 15500, 37500, 31500, 37400, 36000, 31000, 16000, 37000),
  Grade = factor(c("G", "DP", "H", "G", "H", "G", "G", "DP", "H"), 
                 levels = c("DP", "G", "H"))
)

步骤2:使用tidyverse工具链实现(推荐,适合大规模数据)

先加载依赖包:

library(dplyr)
library(tidyr)

核心处理代码:

result <- df %>%
  # 仅保留全职/兼职男性数据
  filter(genderTime %in% c("ftMale", "ptMale")) %>%
  # 按Grade和性别类型分组,计算平均薪资
  group_by(Grade, genderTime) %>%
  summarise(Avg_Salary = mean(Salary), .groups = "drop") %>%
  # 转换为宽格式,并重命名列为目标名称
  pivot_wider(
    names_from = genderTime,
    values_from = Avg_Salary,
    names_glue = case_when(
      genderTime == "ftMale" ~ "Full-time Male",
      genderTime == "ptMale" ~ "Part-time Male"
    )
  ) %>%
  # 确保所有Grade因子水平都被保留,缺失项填充0
  complete(Grade = levels(df$Grade), fill = list(`Full-time Male` = 0, `Part-time Male` = 0)) %>%
  # 兜底替换剩余NA为0
  mutate(across(c(`Full-time Male`, `Part-time Male`), ~replace_na(.x, 0)))

查看结果:

print(result)

输出结果与需求的表格完全一致:

# A tibble: 3 × 3
  Grade `Full-time Male` `Part-time Male`
  <fct>            <dbl>            <dbl>
1 DP                   0            15500
2 G                34000                0
3 H                   0            37250

关键逻辑说明

  • filter:精准筛选目标群体,排除无关的女性数据
  • group_by + summarise:按Grade和性别类型分组计算平均,保证每个分组的统计准确性
  • pivot_wider:将长格式数据转为需求的宽格式,通过names_glue自定义列名
  • complete:强制保留所有Grade因子水平,避免因某Grade无对应数据而被遗漏
  • replace_na:将缺失的平均薪资值替换为0,满足无数据时填0的要求

备选:Base R实现方案

如果不使用tidyverse包,也可以用Base R代码实现:

# 筛选男性数据
male_df <- df[df$genderTime %in% c("ftMale", "ptMale"), ]

# 分组计算平均薪资
avg_salary <- aggregate(Salary ~ Grade + genderTime, male_df, mean)

# 转换为宽格式
wide_df <- reshape(avg_salary, idvar = "Grade", timevar = "genderTime", direction = "wide")

# 重命名列
colnames(wide_df) <- c("Grade", "Full-time Male", "Part-time Male")

# 合并所有Grade水平,填充NA为0
all_grades <- data.frame(Grade = levels(df$Grade))
result_base <- merge(all_grades, wide_df, by = "Grade", all.x = TRUE)
result_base[is.na(result_base)] <- 0

print(result_base)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:05:22