df <- data.frame(group=c(1,2,4,2,1,4,2,3,3),
ts=c("2014-02-13","2014-06-01","2014-02-14","2014-02-11","2013-02-01","2014-02-02","2014-03-21","2014-12-01","2014-02-11"),
letter=letters[1:9])
df$ts <- as.Date(df$ts,format='%Y-%m-%d')
Run Code Online (Sandbox Code Playgroud)
我想找到一个能够生成包含每组最小时间戳的完整行的操作,在本例中,
group ts letter
1 2013-02-01 e
4 2014-02-02 f
2 2014-02-11 d
3 2014-02-11 i
Run Code Online (Sandbox Code Playgroud)
一个快速而肮脏(且缓慢)的基础 R 解决方案是
dfo <- data.frame(df[order(df$ts,decreasing=F),],index=seq(1:nrow(df)))
mins <- tapply(dfo$index,dfo$group,min)
dfo[dfo$index %in% mins,]
Run Code Online (Sandbox Code Playgroud)
直观上,我认为如果有一种方法可以按组添加订单索引,那么我可以过滤到该列的值为 1 的位置,但我不确定如何在没有大量子集和重新连接的情况下执行它。
你可以使用dplyr
library(dplyr)
group_by(df, group) %>% summarise(min = min(ts), letter = letter[which.min(ts)])
# group min letter
# 1 1 2013-02-01 e
# 2 2 2014-02-11 d
# 3 3 2014-02-11 i
# 4 4 2014-02-02 f
Run Code Online (Sandbox Code Playgroud)
您还可以slice对排名行进行排序
group_by(df, group) %>%
mutate(rank = row_number(ts)) %>%
arrange(rank) %>%
slice(1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1565 次 |
| 最近记录: |