R语言dplyr自定义分组描述统计函数报错解决方法
报错原因
核心问题是自定义函数中使用base R的a[,b]/a[,c]取列方式,和dplyr的数据掩码机制不兼容:
across()的第一个参数要求传入tidyselect兼容的列选择规则,直接传入a[,c]相当于把整列的原始数值向量塞给across,它无法识别为合法列选择,遇到向量里的NA值就会触发Selections can't have missing values报错。group_by、pivot_longer、arrange中直接传入a[,b],本质是传入原始数据集的整列向量,而非管道运行到当前步骤时数据集内的对应列,会导致分组、长宽转换、排序的逻辑完全失效。
修正后代码
修正思路是用dplyr官方支持的.data代词引用传入的字符串列名,across中用all_of()匹配传入的列名字符串,完全对齐原始可运行代码的逻辑:
library(dplyr) library(tidyr) # 测试用数据集 df <- data.frame( raca = c("Nel","Nel","Nel", "Nel","Angus","Angus","Angus","Angus"), marmo = c(350, 320, 330, 400, 800, 820, 450, NA) ) desc_function <- function(a, b, c) { a %>% group_by(.data[[b]]) %>% summarise( across(all_of(c), ~data.frame( Média = round(mean(., na.rm=TRUE), digits = 2), N = length(.), DP = round(sd(., na.rm=TRUE), digits = 2), Min = min(., na.rm=TRUE), Max = max(., na.rm=TRUE), `Coef Variação` = round(sd(., na.rm=TRUE)/mean(., na.rm=TRUE)*100, digits=2) )) ) %>% pivot_longer(-all_of(b)) %>% arrange(name, .data[[b]]) } # 函数调用测试 desc_function(df, "raca", "marmo")
运行后输出结果和直接运行原始管道代码的结果完全一致。
注:原始代码中mean(..., digits=2)属于无效传参,mean函数本身没有digits参数,该参数会被直接忽略,修正时已移除避免产生警告。如果需要统计非缺失值样本量,可将N = length(.)替换为N = sum(!is.na(.))。
内容的提问来源于stack exchange,提问作者Curious G.
相关产品推荐
相关产品推荐

