r + 保持时间序列组的第一次观察

r + keeping first observation of time series group

的后续行动(我想将线程分开):我想查看每个用户和他们吃的水果。但我只对 第一次 吃水果感兴趣。从那里,我想按时间对吃掉的水果进行排序。

部分数据:

set.seed(1234)
library(dplyr)

data <- data.frame(
    user = sample(c("1234","9876","4567"), 30, replace = TRUE),
    fruit = sample(c("banana","apple","pear","lemon"), 30, replace = TRUE),
    date = rep(seq(as.Date("2010-02-01"), length=10, by = "1 day"),3))

data <- data %>% arrange(user, date)

在这种情况下,您可以看到,例如,用户 1234 在 2010-02-01 吃了一根香蕉,然后又在 02-03、02-04 和 02-05 吃了一根香蕉。

   user  fruit       date
1  1234 banana 2010-02-01
2  1234  lemon 2010-02-02
3  1234 banana 2010-02-03
4  1234  apple 2010-02-03
5  1234  lemon 2010-02-03
6  1234 banana 2010-02-04
7  1234 banana 2010-02-05

我不想按时间更改水果的相对顺序,但我确实想删除第一个 "banana" 之后的所有后续实例(以及所有其他水果)。

对于本例中的用户 1234,我正在寻找:

   user  fruit       date
1  1234 banana 2010-02-01
2  1234  lemon 2010-02-02
4  1234  apple 2010-02-03

我能想到的一种方法是按用户 > 水果 > 日期排列数据框,然后仅保留用户分组对 "fruit" 的第一个独特观察。我对如何在 dplyr 中做到这一点感到困惑。有什么想法吗?

这是一种使用duplicated函数的方法。

data %>%
group_by(user) %>%
filter(!duplicated(fruit))
#    user  fruit       date
# 1  1234  apple 2010-02-01
# 2  1234 banana 2010-02-01
# 3  1234   pear 2010-02-03
# 4  1234  lemon 2010-02-10
# 5  4567   pear 2010-02-01
# 6  4567 banana 2010-02-05
# 7  4567  lemon 2010-02-08
# 8  9876  apple 2010-02-02
# 9  9876   pear 2010-02-02
# 10 9876  lemon 2010-02-06

dplyr 解决方案将涉及按用户和水果变量分组并过滤具有最低排名日期的行:

data %>%
  group_by(user, fruit) %>%
  filter(row_number(date) == 1)