【问题标题】:summarize in dplyr with the maximum value of the date - R用日期的最大值在 dplyr 中总结 - R
【发布时间】:2016-12-08 12:13:55
【问题描述】:

我有以下数据,

data

date           ID       value1        value2
2016-04-03     1          0              1
2016-04-10     1          6              2
2016-04-17     1          7              3
2016-04-24     1          2              4
2016-04-03     2          1              5
2016-04-10     2          5              6
2016-04-17     2          9              7
2016-04-24     2          4              8

现在我想按 ID 分组并找到 value2 的平均值和 value1 的最新值。某种意义上的最新值,我想获取最新日期的值,即在这里我想获取每个 ID 对应的 2016-04-24 值的 value1。我的输出应该是,

ID       max_value1      mean_value2
1             2              2.5
2             4              6.5 

以下是我正在使用的命令,

data %>% group_by(ID) %>% summarize(mean_value2 = mean(value2))

但我不知道如何做第一个。任何人都可以帮助我在 dplyr 中进行总结时获得 value1 的最新值吗?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这是data.table的选项

    library(data.table)
    setDT(data)[,  .(max_value1 = value1[which.max(date)], 
                            mean_value2 = mean(value2)) , by = ID]
     #   ID max_value1 mean_value2
     #1:  1          2         2.5
     #2:  2          4         6.5
    

    【讨论】:

      【解决方案2】:

      您可以使用dplyr 中的函数nth 来执行此操作,该函数查找向量的第n 个值。

      data %>% group_by(ID) %>% 
      summarize(max_value1 = nth(value1, n = length(value1)), mean_value2 = mean(value2))
      

      这是基于数据按日期排序的假设,如示例中所示;否则使用上面讨论的排列。

      【讨论】:

        【解决方案3】:

        一种方法如下。我在这里的假设是 date 是一个日期对象。您想使用arrange 为每个 ID 安排日期顺序。然后,按ID 对数据进行分组。在summarize 中,您可以使用last() 获取每个ID 的最后一个值1。

        arrange(data,ID,date) %>%
        group_by(ID) %>%
        summarize(mean_value2 = mean(value2), max_value1 = last(value1))
        
        #     ID mean_value2 max_value1
        #  <int>       <dbl>      <int>
        #1     1         2.5          2
        #2     2         6.5          4
        

        数据

        data <- structure(list(date = structure(c(16894, 16901, 16908, 16915, 
        16894, 16901, 16908, 16915), class = "Date"), ID = c(1L, 1L, 
        1L, 1L, 2L, 2L, 2L, 2L), value1 = c(0L, 6L, 7L, 2L, 1L, 5L, 9L, 
        4L), value2 = 1:8), .Names = c("date", "ID", "value1", "value2"
        ), row.names = c(NA, -8L), class = "data.frame")
        

        【讨论】:

        • 没有安排,你可以交替做value1[which.max(date)],虽然这不是很dplyrish。
        • @Frank 当然。那也行。 :)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 2017-12-22
        相关资源
        最近更新 更多