You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:37:23