如何按组获取具有最早时间戳的数据帧的行?

Pat*_*thy 1 r dplyr

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 的位置,但我不确定如何在没有大量子集和重新连接的情况下执行它。

Ric*_*ven 5

你可以使用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)

  • @PatrickMcCarthy,如果您不想重新输入列名称,您还可以使用以下 dplyr 选项 `group_by(df, group) %&gt;% filter(ts %in% min(ts))` 或使用 dplyr 的排名函数如果你想处理关系。 (2认同)