This question already has answers here:
How to select the rows with maximum values in each group with dplyr? [duplicate]

(6个答案)



How to select the row with the maximum value in each group

(17个答案)


去年关闭。




很抱歉,如果有人问这个问题,但我找不到现有的解决方案。

假设数据框d如下
+-------------------------------+
|  date        |  var1  | var2  |
+-------------------------------+
|  2019/01/01  |  100   | abc   |
|  2019/01/01  |  102   | def   |
|  2019/01/02  |  99    | ghi   |
|  2019/01/02  |  98    | jkl   |
|  2019/01/03  |  100   | mno   |
|  2019/01/04  |  105   | pqr   |
|  2019/01/04  |  98    | stu   |
|  2019/01/04  |  110   | vwx   |
+-----------------------------+

与相关的dput()
d <- structure(list(date = structure(c(17897, 17897, 17898, 17898,
17899, 17900, 17900, 17900), class = "Date"), var1 = c(100, 102,
99, 98, 100, 105, 98, 110), var2 = structure(1:8, .Label = c("abc",
"def", "ghi", "jkl", "mno", "pqr", "stu", "vwx"), class = "factor")),
class = "data.frame", row.names = c(NA, -8L))

我想根据以下三个要求从d中删除记录:
  • 每个唯一日期只应保留一条记录
  • d
  • 中同一日期的所有记录中,每个唯一日期选择的记录为max(var1)
  • 我想保留var2(以及真实数据集中的任何其他列)

    因此,有效的所需输出将是
    +----------------------------------+
    |  Date      |  var1   | var2      |
    +----------------------------------+
    |  01/01/19  |  102    | def       |
    |  02/01/19  |  99     | ghi       |
    |  03/01/19  |  100    | mno       |
    |  04/01/19  |  110    | vwx       |
    +----------------------------------+
    

    感谢您的任何帮助。请告知是否可以更好地措词以使其对他人有用。

    最佳答案

    使用data.table:

    library(data.table)
    setDT(d)
    d[, .SD[which.max(var1)], by = date]
    
             date var1 var2
    1: 2019-01-01  102  def
    2: 2019-01-02   99  ghi
    3: 2019-01-03  100  mno
    4: 2019-01-04  110  vwx
    

    原始R的原始翻译可以得出:
    do.call(
      rbind,
      lapply(
        split(d, d[["date"]]),
        function(SD) SD[which.max(SD[["var1"]]), ]
      )
    )
    

  • 07-24 09:52