使用dplyr与mutate按分组添加最小值列报错解决方法
报错原因
slice()是dplyr中按行索引筛选数据的函数,仅接受数据框/tibble类型作为输入。你在mutate()中写slice(which.min(amt))时,传入的which.min(amt)返回值是组内最小值对应的单个行位置数值,属于数值向量,不符合slice()的输入要求,因此触发报错。
另外你的需求是为所有行追加组内统计列,不是筛选行,本身不需要调用slice()。
修正代码
分组后为所有行新增组内统计列,直接在mutate()中调用对应聚合函数即可,最简洁的写法是直接用R内置的min()函数计算组内amt的最小值:
library(dplyr) result <- data %>% group_by(id) %>% mutate(min = min(amt)) %>% ungroup()
运行后得到的result和你给出的预期输出完全一致。
注:末尾加
ungroup()是良好的编码习惯,避免后续对数据框做其他操作时,意外保留分组状态导致计算错误。
如果你习惯用which.min()的索引逻辑,也可以用下面的写法,效果完全相同:
result <- data %>% group_by(id) %>% mutate(min = amt[which.min(amt)]) %>% ungroup()
这种索引写法通用性更强,除了最小值,要取组内最大值、第一个/最后一个观测值、特定位置的值都可以套用相同逻辑。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

