【问题标题】:r + dplyr filtering out time seriesr + dplyr 过滤掉时间序列
【发布时间】:2015-06-25 14:43:55
【问题描述】:

我有一些数据可以查看一组人以及他们在一段时间内吃的水果。我想使用 dplyr 来查看每个人直到他们吃掉一根香蕉,并总结他们吃掉的所有水果直到他们吃掉第一根香蕉

数据:

data <-  structure(list(user = c(1234L, 1234L, 1234L, 1234L, 1234L, 1234L, 
    1234L, 1234L, 1234L, 1234L, 1234L, 1234L, 9584L, 9584L, 9584L, 
    9584L, 9584L, 9584L, 9584L, 9584L, 9584L, 4758L, 4758L, 4758L, 
    4758L, 4758L, 4758L), site = structure(c(1L, 6L, 1L, 1L, 6L, 
    5L, 5L, 3L, 4L, 1L, 2L, 6L, 1L, 6L, 5L, 5L, 3L, 2L, 6L, 6L, 6L, 
    4L, 2L, 5L, 5L, 4L, 2L), .Label = c("apple", "banana", "lemon", 
    "lime", "orange", "pear"), class = "factor"), time = c(1L, 2L, 
    3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 1L, 2L, 3L, 4L, 5L, 
    6L, 7L, 8L, 9L, 5L, 6L, 7L, 8L, 9L, 10L), int = structure(c(2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 
    1L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 1L), .Label = c("banana", 
    "other"), class = "factor")), .Names = c("user", "site", "time", 
    "int"), row.names = c(NA, -27L), class = "data.frame")

我最初的想法是将数据分组以找到每个用户吃香蕉的第一个实例:

data <- data %>% transform(var = ifelse(site=="banana", 'banana','other'))

data_ban <- data %>% 
    filter(var=='banana') %>% 
    group_by(user, var, time) %>%
    group_by(user) %>%
    summarise(first_banana = min(time))

但现在我被困在如何将其实际应用回原始“数据”数据帧,并设置一个过滤器,说明:对于每个用户,只包含数据,直到“data_ban”中给出的时间。有任何想法吗?

【问题讨论】:

  • 您能否也发布预期的输出。可能是data %&gt;% group_by(user) %&gt;% slice(1:(which(int=='banana')[1L]))
  • @akrun,您发布的内容给出了预期的输出。 [1L] 和 Romain 在下面发布的 [1] 有什么区别?
  • 只是得到一个整数索引而不是数字索引。 1L 强制转换为整数(据说更快)
  • 如果您只需要时间最大的行data %&gt;% group_by(user) %&gt;% slice(which.max(time[seq(which(int=='banana')[1L])]))(假设time 未排序。否则,只需which(int=='banana')[1L] 将获得最后一行

标签: r dplyr


【解决方案1】:

你可以试试slice

data %>%
     group_by(user) %>% 
     slice(1:(which(int=='banana')[1L]))

【讨论】:

    【解决方案2】:

    像这样:按user 分组并过滤time 低于他们第一次吃香蕉时的水平。

    > data %>% group_by(user) %>% filter( time <= which(site=="banana")[1] )
    Source: local data frame [17 x 4]
    Groups: user
    
       user   site time    int
    1  1234  apple    1  other
    2  1234   pear    2  other
    3  1234  apple    3  other
    4  1234  apple    4  other
    5  1234   pear    5  other
    6  1234 orange    6  other
    7  1234 orange    7  other
    8  1234  lemon    8  other
    9  1234   lime    9  other
    10 1234  apple   10  other
    11 1234 banana   11 banana
    12 9584  apple    1  other
    13 9584   pear    2  other
    14 9584 orange    3  other
    15 9584 orange    4  other
    16 9584  lemon    5  other
    17 9584 banana    6 banana
    

    否则可能是anti_join

    【讨论】:

    • 我喜欢这个解决方案!我唯一的问题是:向量调用 ([1]) 有什么作用?我发现有了它,我错过了用户 4758,但删除它会产生相同的结果,只是添加了该用户..
    • ...捕获用户第一次吃香蕉的时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2018-11-01
    • 1970-01-01
    相关资源
    最近更新 更多