in `map()`: ℹ In index: 1. ℹ With name: 2023级研究生2班. Caused by error in `object[[...
🚨 错误信息
> map(split(df,df$班级),~median%>% summary)
Error in `map()`:
ℹ In index: 1.
ℹ With name: 2023级研究生2班.
Caused by error in `object[[i]]`:
! object of type 'closure' is not subsettable
Run `rlang::last_trace()` to see where the error occurred.
> median_iqr <- function(x) c(median=median(x),iqr=IQR(x))
> median_iqr(split(df,df$班级))
🤖 AI解决方案
Error in `map()`:
ℹ In index: 1.
ℹ With name: 2023级研究生2班.
Caused by error in `object[[i]]`:
! object of type 'closure' is not subsettable
# 错误翻译
在 `map()` 中:
信息:索引是 1。
信息:命名是 2023级研究生2班。
由以下错误引起:`object[[i]]`:
!类型为 'closure' 的对象不可子集化
原因分析
map() 函数期望接收一个函数作为其第二个参数,而不是一个已经计算好的值或函数本身。你传入的 median %>% summary 实际上是在尝试对 median 这个函数进行 summary 操作,这在 R 中是无效的。 median 是一个函数对象(closure),不能像数据结构那样被索引或子集化(object[[i]])。
解决方案
如果你想对每个分组(班级)的某个数值列(例如,假设是 成绩 列)计算中位数和 IQR,你应该将一个包含计算逻辑的函数传递给 map。
假设你的数据框 df 中有一个名为 成绩 的数值列,你可以这样做:
# 定义一个计算中位数和 IQR 的函数
median_iqr <- function(x) {
c(median = median(x, na.rm = TRUE), iqr = IQR(x, na.rm = TRUE))
}
# 使用 map 对每个分组的 '成绩' 列应用 median_iqr 函数
map(split(df$成绩, df$班级), median_iqr)
或者,如果你想直接在 map 中进行计算,并且使用 purrr 包,可以这样做:
library(purrr)
# 假设 df 中有一个名为 '成绩' 的数值列
map(split(df$成绩, df$班级), ~ median_iqr(.x))
如果你想直接使用 summary 对每个分组的数值列进行汇总,并且 summary 的输出是想要的,那么:
# 假设 df 中有一个名为 '成绩' 的数值列
map(split(df$成绩, df$班级), summary)
预防措施
- 理解
map函数的参数:map的第二个参数必须是一个函数,它将被应用于列表的每个元素。确保你传递的是一个函数定义,而不是对函数的调用或操作。 - 清晰定义计算逻辑:在传递给
map之前,先单独测试你的计算逻辑(例如median_iqr函数)是否能正确工作。