R代码优化:无需新建数据框与左连接实现新增统计列
无需新建数据框与左连接的简洁R实现方案
问题描述
现有一段可运行的R代码,逻辑如下:
- 按
column_a分组,生成total_sub_rows列(统计每组内column_b等于'specific'的行数) - 过滤
column_b为'specific'的数据,按column_a分组统计column_c的不同值数量得到sub_rows列 - 通过左连接将
sub_rows合并回原数据框
希望找到更简洁的实现方式,避免新建数据框与左连接操作。
原代码:
# calculate initial column data <- data %>% group_by(column_a) %>% mutate("total_sub_rows" = sum(column_b == 'specific')) %>% ungroup() # is there a way to get below into above code? new_column <- data %>% filter(column_b == 'specific') %>% group_by(column_a) %>% summarise(sub_rows = n_distinct(column_c)) %>% ungroup() data <- data %>% left_join(new_column)
简洁实现方案
可以在同一分组操作中完成两个列的计算,无需额外的数据框和连接步骤。利用n_distinct()结合条件判断,直接在mutate里生成sub_rows:
data <- data %>% group_by(column_a) %>% mutate( total_sub_rows = sum(column_b == 'specific'), sub_rows = n_distinct(ifelse(column_b == 'specific', column_c, NA), na.rm = TRUE) ) %>% ungroup()
代码解释
total_sub_rows:和原逻辑一致,分组内统计column_b == 'specific'的行数总和sub_rows:通过ifelse仅保留column_b == 'specific'对应的column_c值,其余替换为NA,再用n_distinct(..., na.rm = TRUE)统计分组内非NA的唯一值数量,等价于原代码过滤后统计唯一值的逻辑
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

