在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
相关产品推荐
相关产品推荐

