如何在collapse::collap中为不同汇总操作单独设置na.rm参数?
使用collapse包实现分组汇总时独立设置各字段的na.rm参数
问题背景
我想用R的collapse包对以下数据做分组汇总:
library(collapse) df <- data.frame(id = c(1, 1, 1, 2, 2, 2), var = c(NA, "a", "b", "e", "f", "g"), var1 = c("q", "w", "r", "l", "k", NA), other = c(4, 5, 6, 7, 8, 9)) df # id var var1 other # 1 1 <NA> q 4 # 2 1 a w 5 # 3 1 b r 6 # 4 2 e l 7 # 5 2 f k 8 # 6 2 g <NA> 9
目标是按id分组后完成三个操作:
- 获取
var的第一行(保留NA) - 获取
var1的最后一个非NA值 - 获取
other的均值
预期结果如下:
# id var var1 other # 1 1 <NA> r 5 # 2 2 e k 8
但ffirst和flast默认na.rm=TRUE,且collap的全局na.rm参数无法单独为不同汇总函数配置:
# na.rm = TRUE(默认) collap(df, ~id, custom = list(ffirst = "var", flast = "var1", fmean = "other")) # id var var1 other # 1 1 a r 5 # 2 2 e k 8 # na.rm = FALSE collap(df, ~id, custom = list(ffirst = "var", flast = "var1", fmean = "other"), na.rm = FALSE) # id var var1 other # 1 1 <NA> r 5 # 2 2 e <NA> 8
解决方案
可以通过自定义汇总函数实现不同字段独立设置na.rm参数,以下是两种可行方式:
方式1:在custom参数中使用匿名函数
直接在custom列表中传入带指定na.rm参数的匿名函数,为每个字段单独配置逻辑:
collap(df, ~id, custom = list( function(x) ffirst(x, na.rm = FALSE) = "var", function(x) flast(x, na.rm = TRUE) = "var1", fmean = "other" ))
执行后即可得到预期结果:
# id var var1 other # 1 1 <NA> r 5 # 2 2 e k 8
方式2:提前定义可复用的自定义函数
如果需要重复使用这类逻辑,可以先定义好带固定参数的汇总函数,再传入custom:
# 定义保留NA的ffirst函数 ffirst_keep_na <- function(x) ffirst(x, na.rm = FALSE) # 定义忽略NA的flast函数 flast_drop_na <- function(x) flast(x, na.rm = TRUE) # 调用collap进行分组汇总 collap(df, ~id, custom = list( ffirst_keep_na = "var", flast_drop_na = "var1", fmean = "other" ))
该方式的运行结果与方式1完全一致。
内容的提问来源于stack exchange,提问作者user63230
相关产品推荐
相关产品推荐

