如何在R中基于分组变量生成Sem1与Sem2新列以分析教学顺序影响?
解决R中按分组生成学期成绩列的问题
针对你需要根据分组变量为成绩数据框生成Sem1和Sem2列的需求,这里提供两种简洁高效的实现方法,适配不同的代码习惯:
方法1:用dplyr的case_when(可读性优先,推荐)
如果你常用tidyverse工具链,case_when能清晰直观地定义分组逻辑,后续维护也更方便:
首先加载dplyr包:
library(dplyr)
接着对数据框进行处理:
# 假设你的原始数据框名为df df <- df %>% mutate( Sem1 = case_when( Group == "A" ~ Chemistry, # A组第一学期取化学成绩 Group == "B" ~ English, # B组第一学期取英语成绩 TRUE ~ NA_real_ # 处理非A/B的异常分组(可选) ), Sem2 = case_when( Group == "A" ~ English, # A组第二学期取英语成绩 Group == "B" ~ Chemistry, # B组第二学期取化学成绩 TRUE ~ NA_real_ ) )
方法2:基础R的ifelse函数(轻量无依赖)
如果不想加载额外包,用基础R的ifelse也能快速完成需求:
# 直接为数据框添加新列 df$Sem1 <- ifelse(df$Group == "A", df$Chemistry, df$English) df$Sem2 <- ifelse(df$Group == "A", df$English, df$Chemistry)
结果验证
用你提供的示例数据测试:
# 构造原始示例数据 df <- data.frame( ID = c(1,2,3,4), Group = c("A","B","B","A"), English = c(9,7,7,3), Chemistry = c(4,3,6,10) )
运行上述代码后,得到的结果完全符合你描述的逻辑:
ID Group English Chemistry Sem1 Sem2 1 1 A 9 4 4 9 2 2 B 7 3 7 3 3 3 B 7 6 7 6 4 4 A 3 10 10 3
注:你提供的目标数据示例中第2、3行的Sem1/Sem2值似乎和描述的逻辑不符,大概率是输入笔误,上述代码严格按照你"A组第一学期学化学、第二学期学英语;B组顺序相反"的需求实现。
内容的提问来源于stack exchange,提问作者Neill
相关产品推荐
相关产品推荐

