r +首先观察时间序列组

时间:2015-06-29 15:12:09

标签: r dplyr

this question的跟进(我想保持线程分开):我想看看每个用户以及他们吃的水果。但我只对他们吃水果的第一次时间感兴趣。从那里开始,我想对按时间吃掉的水果进行排序。

一些数据:

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

我不想随时间改变水果的相对顺序,但我确实想删除所有后续的&#34; banana&#34;在第一个之后(和其他所有水果一样)。

对于这种情况下的用户1234,我正在寻找:

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

我能想到的一种方法是按用户排列数据框&gt;水果&gt;约会,然后只保留第一个独特的观察水果&#34;通过用户分组。我对dplyr中究竟如何做到这一点感到困惑。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

这是一种使用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

答案 1 :(得分:1)

dplyr解决方案将涉及按用户和水果变量进行分组,并筛选排名最低的行:

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