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

在R中批量处理同后缀列:求统计量、转换等级及优化代码

R语言数据处理高效优化方案

先贴出原始数据:

df <- data.frame(Name = c("Kevin", "Mary", "Cobe", "Linda", "Lisa"), 
                 ID = c("AZ4524", "AZ4525", "AZ4527", "AZ4544", "AZ4572"), 
                 C = c("B", "A", "A", "C", "A"), C.Score = c(72, 89, 80, 65, 88), 
                 M = c("A", "A", "B", "A", "B"), M.Score = c(95, 89, 70, 85, 87), 
                 E = c("A", "C", "A", "A", "B"), E.Score = c(82, 61, 88, 94, 88), 
                 S = c("A", "A", "A", "B", "A"), S.Score = c(91, 95, 89, 73, 97))

1. 批量计算后缀为.Score列的均值、最大值、最小值

不用逐列编写统计逻辑,用across()批量匹配目标列,一次性生成所有统计结果:

library(dplyr)

score_stats <- df %>%
  select(ends_with(".Score")) %>%
  summarize(
    across(
      everything(),
      list(均值 = mean, 最大值 = max, 最小值 = min),
      .names = "{.col}_{.fn}"
    )
  )

print(score_stats)

该方法会自动为每个Score列生成对应的均值、最大值、最小值统计列,相比逐列处理效率提升明显。

2. 批量转换C/M/E/S列的等级

用across()批量处理C到S的列,配合recode()直接映射等级规则,比嵌套ifelse更简洁高效:

df <- df %>%
  mutate(
    across(C:S, ~ recode(.x, "A" = 2, "B" = 1, "C" = 0))
  )

print(df)

如果需要对未知等级值做兜底处理,可改用case_match:

df <- df %>%
  mutate(
    across(C:S, ~ case_match(.x,
      "A" ~ 2,
      "B" ~ 1,
      "C" ~ 0,
      .default = NA_real_
    ))
  )

3. 批量统计各等级的学生人数

先将C/M/E/S列转成长格式,再统一统计等级频数,无需逐列统计:

# 统计原始等级(A/B/C)的总人数
original_grade_counts <- df %>%
  select(C:S) %>%
  pivot_longer(everything(), names_to = "科目", values_to = "等级") %>%
  count(等级, name = "人数")

print(original_grade_counts)

如果需要按科目拆分统计,只需把count(等级)改成count(科目, 等级)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:45:34