如何用R语言(含dplyr)计算数据框的条件最大值?
解决每个受试者各阶段的Session最大值问题
我来帮你找出代码里的问题,再提供几种可行的解决方案~
你的代码为什么不对?
你用count(ID,Phase,Session)之后,数据会按ID、Phase、Session这三个字段分组统计频数,每个分组里的Session值都是唯一的。这时候再用mutate(MaxSession = max(Session)),其实只是把当前分组的Session值复制了一遍,根本没有计算每个ID+Phase组合下的Session最大值,自然得不到预期结果。
正确的dplyr解决方案
核心思路是按ID和Phase分组,然后对每个组的Session取最大值,用group_by() + summarize()就能实现:
library(dplyr) # 假设你的原始数据框叫DataFrame MaxSessions <- DataFrame %>% group_by(ID, Phase) %>% summarize(MaxSession = max(Session, na.rm = TRUE), # 取最大值,na.rm处理可能的缺失值 .groups = "drop") # 取消分组,得到整洁的结果数据框
运行这段代码后,就能得到你想要的结构:
ID Phase MaxSession <chr> <chr> <int> 1 A1 Train1 2 2 A1 Train2 3 3 B1 Train1 1 4 B1 Train2 3
不用dplyr的基础R方案
如果不想用dplyr,可以用基础R的aggregate()函数,逻辑一样:
# 按ID和Phase分组,对Session取最大值 MaxSessions <- aggregate(Session ~ ID + Phase, data = DataFrame, FUN = max) # 把默认的列名"Session"改成"MaxSession" colnames(MaxSessions)[3] <- "MaxSession"
另外也可以用data.table(适合大数据集,效率更高):
library(data.table) setDT(DataFrame) MaxSessions <- DataFrame[, .(MaxSession = max(Session)), by = .(ID, Phase)]
内容的提问来源于stack exchange,提问作者Tom H
相关产品推荐
相关产品推荐

