对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中究竟如何做到这一点感到困惑。有什么想法吗?
答案 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)