首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按当时的集合分组

按当时的集合分组
EN

Stack Overflow用户
提问于 2017-03-28 14:33:55
回答 3查看 238关注 0票数 0

我正在处理几个大的数据帧,并且需要通过船只和网络将数据排序到第一个也是最后一个条目。我的数据框架如下所示:

代码语言:javascript
复制
Boat     Net     DateTime
Dawn     71      2014-07-10 10:10
Dawn     71      2014-07-15 11:10
Whip     71      2014-07-17 08:10
Whip     71      2014-07-29 12:36
Dawn     71      2014-08-24 14:53
Whip     71      2014-09-02 11:17
Whip     73      2014-09-14 16:24
Whip     71      2014-09-15 18:16
Whip     73      2014-09-17 20:25

我需要的数据只包括第一个,也是最后一个条目的每一个网络通过船。数据应该如下所示:

代码语言:javascript
复制
Boat     Net     DateTime
Dawn     71      2014-07-10 10:10
Whip     71      2014-07-17 08:10
Dawn     71      2014-08-24 14:53
Whip     73      2014-09-14 16:24
Whip     71      2014-09-15 18:16
Whip     73      2014-09-17 20:25

我尝试了几个不同的东西,并得到了接近,但不完全在那里。

代码语言:javascript
复制
Head <- aggregate(df, by = list(df$Net), FUN = head, n = 1)
Tail <- aggregate(df, by = list(df$Net), FUN = tail, n = 1)
Final <- rbind(Head, Tail)

这样做的效果很好,但没有考虑到不同船只上相同的净数目,然后我试着按船分组,但得到了同样的结果:

代码语言:javascript
复制
Head <- df %>% group_by(Boat) %>% aggregate(df, by = list(df$Net), FUN = head, n = 1) %>% ungroup

这两个函数都返回了以下数据:(第一项,也是最后一项,仅按净编号)

代码语言:javascript
复制
Boat     Net     DateTime
Dawn     71      2014-07-10 10:10
Whip     73      2014-09-14 16:24
Whip     71      2014-09-15 18:16
Whip     73      2014-09-17 20:25

我想我已经很接近了,但是不能完全到达那里,任何帮助都是非常感谢的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-28 14:54:13

对于聚合方法,您可以通过向df$Boatdf$Net提供aggregate来获得所需的东西。

代码语言:javascript
复制
Head <- aggregate(df, by = list(df$Boat, df$Net), FUN = head, n = 1)
Tail <- aggregate(df, by = list(df$Boat, df$Net), FUN = tail, n = 1)
Final <- rbind(Head, Tail)

既然您尝试使用dplyr的group_by,下面是一个dplyr替代方案,它按组使用slice

代码语言:javascript
复制
Final <- df %>%
  group_by(Boat, Net) %>%
  slice(c(1, n())) %>%
  ungroup()

(请注意,group_byaggregate没有做任何特殊的组合- group_by只与其他dplyr函数(如slicesummarizemutate)一起工作)。

票数 3
EN

Stack Overflow用户

发布于 2017-03-28 14:59:22

代码语言:javascript
复制
do.call(rbind, lapply(split(df, paste(df$Boat, df$Net, sep = "-")),
           function(a) a[c(1, NROW(a)),]))
#          Boat Net         DateTime
#Dawn-71.1 Dawn  71 2014-07-10 10:10
#Dawn-71.5 Dawn  71 2014-08-24 14:53
#Whip-71.3 Whip  71 2014-07-17 08:10
#Whip-71.8 Whip  71 2014-09-15 18:16
#Whip-73.7 Whip  73 2014-09-14 16:24
#Whip-73.9 Whip  73 2014-09-17 20:25

数据

代码语言:javascript
复制
df = structure(list(Boat = c("Dawn", "Dawn", "Whip", "Whip", "Dawn", 
"Whip", "Whip", "Whip", "Whip"), Net = c(71L, 71L, 71L, 71L, 
71L, 71L, 73L, 71L, 73L), DateTime = c("2014-07-10 10:10", "2014-07-15 11:10", 
"2014-07-17 08:10", "2014-07-29 12:36", "2014-08-24 14:53", "2014-09-02 11:17", 
"2014-09-14 16:24", "2014-09-15 18:16", "2014-09-17 20:25")), .Names = c("Boat", 
"Net", "DateTime"), class = "data.frame", row.names = c(NA, -9L
))
票数 1
EN

Stack Overflow用户

发布于 2017-03-28 15:21:38

下面是data.table的一个选项

代码语言:javascript
复制
library(data.table)
setDT(df)[, .SD[c(1, .N)], .(Boat, Net)]
#   Boat Net         DateTime
#1: Dawn  71 2014-07-10 10:10
#2: Dawn  71 2014-08-24 14:53
#3: Whip  71 2014-07-17 08:10
#4: Whip  71 2014-09-15 18:16
#5: Whip  73 2014-09-14 16:24
#6: Whip  73 2014-09-17 20:25
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43072397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档