【问题标题】:Calculating average time difference by group using dplyr使用 dplyr 按组计算平均时间差
【发布时间】:2016-08-30 07:22:01
【问题描述】:

假设我有以下数据框表示用户在各个公司注册应用程序的日期:

df <- data.frame(user = c("Tia", "Sam", "Matt", "Brandy", "Joe", "Nariko"),
                 company = c("Intel", "Intel", "Nvidia", "Nvidia", "Nvidia", "Google"),
                 registrationDate = as.Date(c("2015-01-04", "2015-01-04", "2015-01-19", 
                                              "2015-01-20", "2015-01-20", "2015-01-25")),
                 stringsAsFactors = FALSE)

如何创建一个向量,让我知道每家公司的用户注册应用程序的平均时间差?

我在获取公司对日期变量的简单汇总统计数据时遇到了一些麻烦。例如,当我尝试使用 dplyr 查找每个公司的最长注册日期时:

library(dplyr)
df %>% 
  group_by(company) %>%
  mutate(maxDate = max(registrationDate))

我获得了为数据框中的每一行复制的整个 registrationDate 向量的最大日期。就好像 max() 函数忽略了 dplyr 的管道。

【问题讨论】:

  • 您能否显示预期的输出,因为从您的描述和代码中不清楚。是df %&gt;% group_by(company) %&gt;% mutate(AvgTime = mean(diff(registrationDate)))
  • 抱歉,不清楚。我想要最大时差除以每家公司的用户数。类似 (difftime(max(df$registrationDate), min(df$registrationDate)))/num_users
  • @akrun 出于某种原因,您的 mutate 函数的结果将每个公司的 avgTime 计算为 4.2。但是,假设我们首先使用 df2 &lt;- filter(df, company == "Nvidia") 过滤 df,然后在 df2 上再次运行您的代码,我们会发现 avgTime 现在是 0.5
  • 也许是df %&gt;% group_by(company) %&gt;% mutate(new = max(diff(registrationDate))/ length(unique(user)))

标签: r date dplyr


【解决方案1】:

另一个,用summarize代替mutate

df2 = df %>% 
  group_by(company) %>%
  summarize(minDate = min(registrationDate), maxDate = max(registrationDate), num_users = n())

> df2
Source: local data frame [3 x 4]

   company    minDate    maxDate num_users
     (chr)     (date)     (date)     (int)
 1  Google 2015-01-25 2015-01-25         1
 2   Intel 2015-01-04 2015-01-04         2
 3  Nvidia 2015-01-19 2015-01-20         3

df2$result = difftime(df2$maxDate, df2$minDate, units = "days")/df2$num_users

> df2
Source: local data frame [3 x 5]

  company    minDate    maxDate num_users     result
    (chr)     (date)     (date)     (int)     (dfft)
1  Google 2015-01-25 2015-01-25         1     0 days
2   Intel 2015-01-04 2015-01-04         2     0 days
3  Nvidia 2015-01-19 2015-01-20         3 0.3333333 days

【讨论】:

    【解决方案2】:
    df %>% group_by(company) %>% 
      mutate(AvgTime = (max(registrationDate)-min(registrationDate))/length(company))
    
        user company registrationDate        AvgTime
    1    Tia   Intel       2015-01-04 0.0000000 days
    2    Sam   Intel       2015-01-04 0.0000000 days
    3   Matt  Nvidia       2015-01-19 0.3333333 days
    4 Brandy  Nvidia       2015-01-20 0.3333333 days
    5    Joe  Nvidia       2015-01-20 0.3333333 days
    6 Nariko  Google       2015-01-25 0.0000000 days
    

    【讨论】:

    • 这就是我想要的!但是,在我的机器上运行你的线路,我每行都会得到AvgTime = 3.5
    • 已解决。我不得不在我的 Mac 上删除并重新安装 dplyr。不知道那里发生了什么。
    猜你喜欢
    • 1970-01-01
    • 2018-03-21
    • 2018-05-23
    • 2019-10-20
    • 2021-05-08
    • 2023-03-14
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    相关资源
    最近更新 更多