使用自定义函数调用lapply时出现意外结果的技术问题
解决每4个元素分组计算均值的问题
没问题,我来帮你搞定这个用lapply结合自定义函数计算分组均值的问题!首先咱们先把你的三个数据集在R里明确定义出来:
dataone <- c(5.7, 15.3, 14.0, 13.2, 14.0, 9.4, 19.0, 13.7, 19.4, 19.3, 11.5, 16.6, 17.7, 3.2, 4.7, 1.4, 18.4, 10.1, 9.6, 16.4) datatwo <- c(21, 13, 29, 29, 22, 13, 18, 13, 29, 13, 23, 17, 17, 11, 29, 15, 20, 21, 26, 17) datathree <- c(6.7, 9.8, 1.9, 5.9, 5.3, 5.2, 1.2, 5.3, 2.2, 8.6, 2.9, 4.6, 4.9, 6.1, 9.4, 10.0, 5.1, 9.8, 3.1, 3.2)
可能的问题根源
你提到用lapply调用自定义函数得到意外结果,大概率是两个常见问题:
- 没有把三个数据集放进列表里传给
lapply(lapply的第一个参数必须是列表/向量,直接传三个独立向量会出错) - 自定义函数里的分组逻辑没写对,比如没有正确按每4个元素拆分向量
正确的实现方法
1. 编写自定义分组均值函数
这个函数接收一个数值向量,按每4个元素为一组拆分,然后计算每组的均值:
calc_group_mean <- function(vec) { # 生成分组标识:每4个元素一组,用ceiling实现向上取整分组 group_ids <- ceiling(seq_along(vec) / 4) # 按分组拆分向量 grouped_data <- split(vec, group_ids) # 计算每个分组的均值 sapply(grouped_data, mean) }
2. 将数据集放入列表并调用lapply
lapply需要遍历一个列表,所以先把三个数据集打包成列表,再传入函数:
# 把三个数据集放进列表 data_list <- list(dataone, datatwo, datathree) # 用lapply批量计算每个数据集的分组均值 result <- lapply(data_list, calc_group_mean)
3. 查看结果
运行后result是一个包含3个元素的列表,每个元素对应原数据集的5组均值(20个元素÷4=5组):
- 第一个元素是
dataone的分组均值:[1] 12.050 14.025 16.700 6.750 13.625 - 第二个元素是
datatwo的分组均值:[1] 23.00 16.50 20.50 20.50 21.00 - 第三个元素是
datathree的分组均值:[1] 5.825 4.250 4.575 7.600 5.300
简化版实现(可选)
如果你不想写自定义函数,也可以用purrr包的map结合slider包的slide_dbl更简洁实现,但上面的基础R方法已经完全够用:
# 需要先安装并加载包 # install.packages(c("purrr", "slider")) library(purrr) library(slider) result <- map(data_list, ~slide_dbl(.x, mean, .before = 3, .step = 4))
内容的提问来源于stack exchange,提问作者Mel
相关产品推荐
相关产品推荐

