in `map()`: ℹ In index: 1. ℹ With name: 2023级研究生2班. Caused by error in `object[[...

2025年09月20日 00:54 响应: 3.73秒 状态: success

🚨 错误信息

> 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 函数)是否能正确工作。