很抱歉,如果有人问这个问题,但我找不到现有的解决方案。
假设数据帧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)因此,有效的必需输出应为
+----------------------------------+
| Date | var1 | var2 |
+----------------------------------+
| 01/01/19 | 102 | def |
| 02/01/19 | 99 | ghi |
| 03/01/19 | 100 | mno |
| 04/01/19 | 110 | vwx |
+----------------------------------+
感谢您的帮助。请告知是否可以更好地措辞以使问题对其他人有用。
答案 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))