gpt4 book ai didi

r - 分组数据帧 (dplyr) R 中每个元素的值总和大于或等于

转载 作者:行者123 更新时间:2023-12-02 01:57:16 28 4
gpt4 key购买 nike

我有一个相对较大的数据帧(约 2,000,000 行),对于每一行,我需要在该观察组内计算大于或等于当前行值的每个值的总和。

这是一个示例数据框:

sample_df = data.frame(
group_id = c(1,1,1,1,2,2,2,2),
value = c(10,12,14,12,8,8,21,10)
)

我目前有一个非常慢的解决方案,使用循环和一些过滤来做到这一点,但是,拥有更快的解决方案将是更好的选择。我一直在尝试使用 dplyr 但是,我不知道如何在数据分组后获得其他观察值的总和。

对于上面的玩具示例,以下是所需的输出:

desired_output = data.frame(
group_id = c(1,1,1,1,2,2,2,2),
value = c(10,12,14,12,8,8,21,10),
output = c(38,26,0,26,39,39,0,21)
)

在寻找已经发布的解决方案时,我没有看到一个明确的答案来解释如何将一组中的每个观察结果与该组中的其他观察结果进行比较,并根据某些标准进行过滤。我更喜欢基于 dplyr 的解决方案,但如果有高效的 base-R 或 data.table 解决方案,我将同样感激不已!

最佳答案

使用tidyverse。诀窍是使用 map_dbl 循环每个

library(tidyverse)
sample_df %>%
group_by(group_id) %>%
mutate(output= map_dbl(value,~sum(value[value>=.x]))-value) %>%
ungroup

# A tibble: 8 x 3
group_id value output
<dbl> <dbl> <dbl>
1 1 10 38
2 1 12 26
3 1 14 0
4 1 12 26
5 2 8 39
6 2 8 39
7 2 21 0
8 2 10 21
mutate 行中的

value 是您的 value '子列'(组),而 .x 是您要循环的元素上。

基本解决方案

within(sample_df,output <- unlist(tapply(
value,group_id,function(x) sapply(x,function(y) sum(x[x>=y])-y))))
# group_id value output
# 1 1 10 38
# 2 1 12 26
# 3 1 14 0
# 4 1 12 26
# 5 2 8 39
# 6 2 8 39
# 7 2 21 0
# 8 2 10 21

关于r - 分组数据帧 (dplyr) R 中每个元素的值总和大于或等于,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49437724/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com