计算过滤和分组后的平均值

Posted

技术标签:

【中文标题】计算过滤和分组后的平均值【英文标题】:Calculate the mean after filtering and groupby 【发布时间】:2021-12-27 02:54:13 【问题描述】:

我有一个大型的消息交换数据框,如下所示:

structure(list(from = c(1, 8, 3, 3, 8, 1, 4, 5, 8, 3, 1, 8, 4, 
1, 4, 8, 1, 4, 5, 8, 3, 1, 8, 1, 4, 8), to = c(8, 3, 8, 54, 3, 
4, 1, 6, 7, 1, 4, 3, 8, 8, 1, 3, 4, 1, 6, 7, 1, 4, 3, 8, 1, 3
), time = c(63200, 81282, 81543, 81548, 81844, 82199, 82514, 
82711, 82739, 82814, 82936, 83889, 84207, 84427, 85523, 85545, 
86883, 87187, 87701, 89004, 89619, 92662, 93384, 93443, 94042, 
94203), month = c(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6), day = c(1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 15, 15, 15, 15, 15, 15
)), class = "data.frame", row.names = c(NA, -26L))

我的目标是计算某人在一天中收到的第一条消息和最后一条消息之间的平均时间差。

所以,我的目标是通过索引过滤数据集,如果它出现在“from”的“to”列上,则使用月份(“month”)和数字按天分组月中的某一天(“天”),然后我想计算每天第一条消息和最后一条消息之间的差异,然后我想平均这些差异。

最后我应该得到一个数据框,其中包含索引和每个索引的每日平均值。像这样:

index      avg
1     1 9429.333
2     3 2590.667
3     4 1982.000
4     8 7338.000

1 的值是每天的最大和最小时间差的平均值:19164(对于第 2 个月的第 1 天)、4251(对于第 4 个月的第 2 天)和 4423(对于第 15 天)第 6 个月)。(注意:当差异等于 0 时,该数字应从平均值中排除,如指数 8 的第 3 个月第 4 天)

我现在正在尝试这个,但它不起作用

dur<-function(x)max(x)-min(x)  #The function to calculate the difference. In other cases I need to use other functions of my own

#index are the Names of the indexes for which I want the calculation
index <- c(1, 3, 4, 8)
names(index) <- index

index %>%
 map_dfr(~ df %>% filter(from == .x | to == .x) %>% group_by (month,day) %>% 
     summarize(result = dur(time)) %>% 
      summarize(mdur = mean(result)) ,.id = "index")`

下面的一个用于计算所有消息的时间差,但我还需要每日平均值

index %>% 
  map_dfr(~ df %>% 
        filter(from == .x | to == .x) %>% 
        summarize(result = dur(time)),
        .id = "index")

【问题讨论】:

(1) 需要定义index。 (2) 根据您的输入,您的预期输出如何? 我已经定义了索引,还添加了预期的输出和对其的解释。谢谢! 【参考方案1】:
library(dplyr)
df = data.frame(from = c(1, 8, 3, 3, 8, 1, 4, 5, 8, 3, 1, 8, 4, 1, 4, 8, 1, 4, 5, 8, 3, 1, 8, 1, 4, 8, 2 ,3), 
           to = c(8, 3, 8, 54, 3, 4, 1, 6, 7, 1, 4, 3, 8, 8, 1, 3, 4, 1, 6, 7, 1, 4, 3, 8, 1, 3, 5, 8), 
           time = c(63200, 81282, 81543, 81548, 81844, 82199, 82514, 82711, 82739, 82814, 82936, 83889, 84207, 84427, 85523, 85545, 86883, 87187, 87701, 89004, 89619, 92662, 93384, 93443, 94042, 94203, 12402, 24932), 
           month = c(2, 2, 2, 2,  2,  2,  2,  2,  2,  2,  4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,  6,  6,  6,  6,  6, 9, 9), 
           day =   c(1, 1, 1, 15, 15, 22, 22, 22, 25, 25, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 15, 15, 15, 18, 18, 18, 9, 9))

df2 <- df %>% group_by(day, month) %>% summarise(f = first(time), l = last(time)) %>% mutate(diff = l - f) %>% group_by(month) %>% summarise(mt = sum(diff)/length(which(diff!=0)))

这给出了:

> df2
# A tibble: 4 × 2
  month      mt
  <dbl>   <dbl>
1     2  4806.5
2     4  1834.5
3     6  2262.5
4     9 12530.0

这就是你所追求的吗?

虽然您提到了某个人的一些事情,但您的数据不包含 person 列,所以我假设这是来自同一个人的数据。如果您有多个人,只需将此代码分别应用于每个人即可。

【讨论】:

我已经编辑了我的问题以使其更清晰。我需要按天和按指数计算差异的平均值。需要列 from 和 to 来按索引过滤数据库(我只需要包含该索引的消息来进行以后的计算),然后需要列月和日然后按特定日期分组(第 1 天第 2 天,就像说二月第一)。我需要计算每天的差异,然后平均这些差异以获得 1 个指数的值。我需要对索引中的完整列表进行操作 我有几个问题:(1)你能提供一个适当的数据样本吗?也许跨越3个月? (2)我的理解方式:(i)您需要最后一条消息时间和第一条消息时间之间的每日差异列,以及(ii)然后是每月(索引)平均值,不包括零差异,对吗? (3) 指数和月份有什么区别? 'index' 只是几个月的计数器变量吗? (1) 我已经包含了一个更大的数据集,其中包含 4 个不同的日子作为示例。 (2) 是的,但这只是计算平均值的中间步骤。最后,我不需要这些单独的数字。使用“月”和“日”列来标识各个天。如果我们只使用“天”,我们将混合来自不同月份的信息(一条消息可能是 2 月 1 日,另一条是 3 月 1 日)(3)我只需要每一天的平均值。 (4) 数据集是关于人与人之间的信息交流。该索引是一个列表,其中包含我想要计算的所有人员 通俗地说,想象你是第 3 个人。我需要过滤以获取所有涉及你的消息(因此在“to”或“from”中使用 3)。然后,我需要每天知道第一条消息和最后一条消息之间经过了多长时间。然后我只需要所有这些每日差异的平均值(不包括 0's)。我需要对索引列表中的每个人都进行此计算。

以上是关于计算过滤和分组后的平均值的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用aov函数进行单因素协方差分析(One-way ANCOVA)使用effects包中的effect函数来计算调整后的分组均值(calculate adjusted means)

分组函数05

在 csv python 中排序、分组和计算平均值

使用子查询和分组依据每天计算每个国家/地区的 DAU 平均值

python pandas groupby分组后的数据怎么用

如何计算按列名分组的数据框/矩阵中的平均值和标准差