如何基于分组与dist索引汇总R语言数据框的vals列值?
Hey there! 你已经搞定了分组和dist列的计算,现在要在每个grps分组里,给每行计算所有dist值≤当前行dist的vals之和对吧?我给你两个适配dplyr的解决方案,都能得到你想要的结果:
方法1:用rowwise()直观实现(适合小数据集)
这个方法逻辑直白,先按组拆分,然后逐行处理,筛选同组内符合条件的行再求和:
library(dplyr) final_result <- rslt %>% group_by(grps) %>% rowwise() %>% # 筛选当前组里dist<=当前行dist的vals,求和 mutate(sum = sum(vals[dist <= cur_data()$dist])) %>% # 如果不需要保留分组结构,可以去掉ungroup() ungroup()
方法2:用purrr::map_dbl()更高效(适合大数据集)
如果你的数据集比较大,rowwise()的效率会稍弱,用map_dbl()遍历组内的行,速度会更快:
library(dplyr) library(purrr) final_result <- rslt %>% group_by(grps) %>% # 遍历每个dist值,计算同组内dist<=该值的vals总和 mutate(sum = map_dbl(dist, ~sum(vals[dist <= .x]))) %>% ungroup()
验证结果
运行任意一段代码后,你都会得到预期的输出:
# A tibble: 5 × 5 vals grps dts dist sum <dbl> <dbl> <date> <dbl> <dbl> 1 1 1 2020-01-01 1 3 2 2 1 2020-01-02 0 2 3 3 2 2020-01-03 2 12 4 4 2 2020-01-04 1 9 5 5 2 2020-01-05 0 5
小提示
cur_data()在rowwise()模式下,会返回当前组的所有数据,所以cur_data()$dist能拿到同组的全部dist值,用来筛选符合条件的vals。map_dbl()里的.x代表当前遍历到的dist值,逻辑和rowwise()一致,但底层实现更高效。
内容的提问来源于stack exchange,提问作者LxndrF
相关产品推荐
相关产品推荐

