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

如何在dplyr::summarise中编写带条件的自定义ratio_function?

解决dplyr summarise中自定义函数无法识别变量的问题

问题核心是:自定义函数默认会在全局环境查找变量,而summarise里的列绑定在分组后的局部数据环境中,因此需要明确告诉函数从当前数据框读取列。以下是两种简单可行的解决方法:

方法1:使用.data代词

.data是dplyr提供的专属代词,用于明确引用当前数据框中的列,能直接解决环境识别问题。定义函数如下:

ratio_function <- function(cat_val) {
  sum_surface <- sum(.data$surface[.data$category == cat_val], na.rm = TRUE)
  sum_total_area <- sum(.data$total_area[.data$category == cat_val], na.rm = TRUE)
  mean_mean <- mean(.data$`MEAN`[.data$category == cat_val], na.rm = TRUE)
  
  sum_surface / sum_total_area * mean_mean
}

之后即可按需求调用:

data <- data %>% 
  group_by(ID) %>% 
  summarise(sum_ratio = ratio_function("A"))

方法2:使用cur_data()获取当前分组数据

cur_data()会返回当前分组的完整数据框,通过它也能直接访问所有列:

ratio_function <- function(cat_val) {
  current_df <- cur_data()
  
  sum_surface <- sum(current_df$surface[current_df$category == cat_val], na.rm = TRUE)
  sum_total_area <- sum(current_df$total_area[current_df$category == cat_val], na.rm = TRUE)
  mean_mean <- mean(current_df$`MEAN`[current_df$category == cat_val], na.rm = TRUE)
  
  sum_surface / sum_total_area * mean_mean
}

验证示例

用以下测试数据验证功能:

library(tibble)
library(dplyr)

# 构造测试数据
test_data <- tibble(
  ID = rep(1:2, each = 3),
  category = c("A", "A", "B", "A", "B", "B"),
  surface = c(10, 20, 30, 15, 25, 35),
  total_area = c(100, 200, 300, 150, 250, 350),
  `MEAN` = c(2, 4, 6, 3, 5, 7)
)

# 调用函数
test_data %>% 
  group_by(ID) %>% 
  summarise(sum_ratio = ratio_function("A"))

输出结果:

# A tibble: 2 × 2
     ID sum_ratio
  <int>     <dbl>
1     1       0.3
2     2       0.3

内容的提问来源于stack exchange,提问作者Maxime Buron

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:49:59