从每个唯一日期的var小于max(var)的数据框中删除行

时间:2019-01-11 12:56:37

标签: r dataframe

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

假设数据帧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中删除记录:

  1. 每个唯一日期仅保留一条记录
  2. d中同一日期的所有记录中,每个唯一日期选择的记录为max(var1)
  3. 我要保留var2(以及真实数据集中的其他任何列)

因此,有效的必需输出应为

+----------------------------------+
|  Date      |  var1   | var2      | 
+----------------------------------+
|  01/01/19  |  102    | def       |
|  02/01/19  |  99     | ghi       |
|  03/01/19  |  100    | mno       |
|  04/01/19  |  110    | vwx       |
+----------------------------------+

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

2 个答案:

答案 0 :(得分:3)

使用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"]]), ]
  )   
)

答案 1 :(得分:2)

使用dplyr

library(dplyr)
d %>%
   group_by(date) %>%
   slice(which.max(var1))