如何用lapply循环对分组列应用同函数实现不同统计计算
解决R语言分组计算均值与方差的问题
我来帮你一步步实现这个需求,咱们从分组到函数修改再到循环计算,一步步来:
1. 先对数据列进行分组
首先咱们需要把mydata里的列按照x、y、z分成三组,每组包含对应的1和2列。可以用split结合substr提取列名前缀来实现:
# 定义原数据 mydata<-structure(list(x1 = c(0, 8.6, 11.2, 8.4, 0, 0), x2 = c(0, 0, 7.8, 7.6, 1.2, 10.2), y1 = c(0, 0, 3.4, 21.4, 1.8, 1.4), y2 = c(7.8, 7.6, 1.2, 10.2, 7, 0), z1 = c(0, 1.6, 7.6, 23.6, 3.2, 0), z2 = c(8.6, 1.4, 0, 0, 0, 0)), .Names = c("x1", "x2", "y1", "y2", "z1", "z2" ), class = "data.frame", row.names = c(NA, -6L)) # 按列名前缀(x/y/z)分组,得到包含三个元素的列表 groups <- split(mydata, substr(names(mydata), 1, 1))
执行后groups里的每个元素就是对应x、y、z的两列数据,比如groups$x就是x1和x2列。
2. 修改自定义函数myfun
咱们需要把函数改成能处理每组的两列,计算第一列的均值和第二列的方差:
myfun<- function(group) { # 计算组内第一列(*1)的均值 mean_first <- mean(group[[1]], na.rm = TRUE) # 计算组内第二列(*2)的方差 var_second <- var(group[[2]], na.rm = TRUE) # 返回带命名的结果列表 list(mean_of_first_col = mean_first, var_of_second_col = var_second) }
这个函数接受一个分组(比如groups$x),然后分别处理两列的统计量,最后返回清晰命名的结果。
3. 用lapply循环计算
现在用lapply遍历每个分组,应用myfun就能得到按x、y、z分组的结果:
# 循环计算每个分组的统计量 result <- lapply(groups, myfun) # 查看结果 print(result)
执行后输出的result是一个列表,每个元素对应x、y、z的均值和方差:
$x $x$mean_of_first_col [1] 4.7 $x$var_of_second_col [1] 16.856 $y $y$mean_of_first_col [1] 4.666667 $y$var_of_second_col [1] 14.2576 $z $z$mean_of_first_col [1] 6 $z$var_of_second_col [1] 13.144
4. 可选:转成数据框格式
如果想要更规整的数据框输出,可以用do.call和rbind把结果转成数据框:
result_df <- as.data.frame(do.call(rbind, result)) print(result_df)
输出会是:
mean_of_first_col var_of_second_col x 4.700000 16.8560 y 4.666667 14.2576 z 6.000000 13.1440
这样就完全满足你的需求啦:按x、y、z分组,每组包含对应第一列的均值和第二列的方差,而且用了lapply来完成循环操作。
内容的提问来源于stack exchange,提问作者Hüsamettin Tayşi
相关产品推荐
相关产品推荐

