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