如何在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
相关产品推荐
相关产品推荐

