dplyr::group_by函数分组的因子数量是否存在上限?
问题解答
关于group_by的分组数量限制
dplyr的group_by函数本身没有硬编码的分组数量上限,9万量级的分组属于正常可处理的范围,该问题和分组因子的数量没有直接关系。
全NA结果的排查方向
- 先验证分组的行数分布:运行如下代码查看每个
id_specific分组的行数统计:
result_data %>% count(id_specific) %>% pull(n) %>% summary()
如果存在大量分组仅包含1行数据,调用lag(n=1)时会因为没有前序行返回默认的NA,属于符合逻辑的结果。如果业务上不需要单条数据的分组,可以在分组后先过滤再计算:
final_date = result_data %>% group_by(id_specific)%>% filter(n() >=2) %>% arrange(time, .by_group = TRUE) %>% # 开启组内排序 mutate(wear = dplyr::lag(some_value, n = 1, default = NA) - some_value)
- 修正排序逻辑:现有代码是先对全数据集按time排序再分组,无法保证每个分组内部的行按time升序排列,正确做法是在
arrange中添加.by_group = TRUE参数,或在排序时同时指定分组变量:arrange(id_specific, time)。 - 排查分组变量的异常值:如果
id_specific是字符型变量,检查是否存在大小写差异、首尾空格、不可见字符导致原本应该归为同一组的记录被拆分为多个单条分组,可先做清洗再分组:
final_date = result_data %>% mutate(id_specific = stringr::str_squish(id_specific) %>% tolower()) %>% # 清洗分组变量 arrange(id_specific, time) %>% group_by(id_specific)%>% mutate(wear = dplyr::lag(some_value, n = 1, default = NA) - some_value)
替代实现方案
针对400万行的大数据量场景,也可以使用data.table实现相同逻辑,计算效率更高:
library(data.table) setDT(result_data) # 按id_specific分组,组内按time排序后计算损耗 result_data[order(time), wear := shift(some_value, n=1, type = "lag") - some_value, by = id_specific]
内容的提问来源于stack exchange,提问作者DR15
相关产品推荐
相关产品推荐

