我正在处理几个大的数据帧,并且需要通过船只和网络将数据排序到第一个也是最后一个条目。我的数据框架如下所示:
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我需要的数据只包括第一个,也是最后一个条目的每一个网络通过船。数据应该如下所示:
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我尝试了几个不同的东西,并得到了接近,但不完全在那里。
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)这样做的效果很好,但没有考虑到不同船只上相同的净数目,然后我试着按船分组,但得到了同样的结果:
Head <- df %>% group_by(Boat) %>% aggregate(df, by = list(df$Net), FUN = head, n = 1) %>% ungroup这两个函数都返回了以下数据:(第一项,也是最后一项,仅按净编号)
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我想我已经很接近了,但是不能完全到达那里,任何帮助都是非常感谢的。
发布于 2017-03-28 14:54:13
对于聚合方法,您可以通过向df$Boat和df$Net提供aggregate来获得所需的东西。
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:
Final <- df %>%
group_by(Boat, Net) %>%
slice(c(1, n())) %>%
ungroup()(请注意,group_by和aggregate没有做任何特殊的组合- group_by只与其他dplyr函数(如slice、summarize或mutate)一起工作)。
发布于 2017-03-28 14:59:22
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数据
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
))发布于 2017-03-28 15:21:38
下面是data.table的一个选项
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:25https://stackoverflow.com/questions/43072397
复制相似问题