dplyr :: group_by保留未分组的变量

时间:2016-08-08 12:04:57

标签: r group-by dplyr

我有一个包含客户的数据库(user_reg)'信息(customer_id),其注册日期(reg_date2)和订单日期(order_date2;通常>每位客户1)。

我想知道 1)当第一个订单发生时然后 2)最后得到tbluser_idreg_date2first_order

执行以下代码后

  user_reg %>% select(user_id, reg_date2, order_date2) %>% 
  group_by(user_id) %>% 
  mutate(first_order=min(order_date2)) %>%
  select(user_id, reg_date2, first_order) %>%
  arrange(user_id) %>%
  group_by(user_id)

每个user_id我仍然会获得多行。

user_id  reg_date2 first_order
     <int>     <date>      <date>
1       -1 2015-11-03  2015-11-25
2        1 2013-10-24  2014-10-11
3        1 2013-10-24  2014-10-11
4        1 2013-10-24  2014-10-11
5        1 2013-10-24  2014-10-11
6        1 2013-10-24  2014-10-11

任何想法如何解决?

1 个答案:

答案 0 :(得分:4)

mutate函数会将变量添加到现有数据集中,因此您始终会以相同的行数开始。

您可以添加distinct函数,以便每个ID只保留一个唯一的行。要保留所有其他变量,您需要.keep_all参数。

... %>%
    group_by(user_id) %>% 
    mutate(first_order = min(order_date2)) %>%
    distinct(first_order, .keep_all = TRUE) 

每个id从多行转到一行通常是summarise,尽管这会丢弃其他变量。如果真实用例如此简单,则可以将附加变量作为分组变量包含在内,因为reg_date2似乎每user_id都是唯一的。

... %>%
    group_by(user_id, reg_date2) %>% 
    summarise(first_order = min(order_date2))

或者(但更多打字),保留reg_date2可以通过将其包含在summarise中来完成:

... %>%
group_by(user_id) %>% 
    summarise(reg_date2 = unique(reg_date2), 
              first_order = min(order_date2))