R 基于另一个变量的最小值(基于另一个变量组)提取值

R 基于另一个变量的最小值(基于另一个变量组)提取值,r,R,我知道我的标题可能没有意义,所以让我解释一下。我有一个数据框,里面有大约3000个观察值和多个列。下面给出一个例子 ID T1 T2 1 00:00:04 00:09:00 1 00:05:00 01:00:59 2 00:39:00 05:23:00 2 00:23:52 06:12:31 2 00:40:50 00:00:01 3 01:05:01 00:32:00 ID T1 T2 EarliestT2Time 1

我知道我的标题可能没有意义,所以让我解释一下。我有一个数据框,里面有大约3000个观察值和多个列。下面给出一个例子

ID   T1        T2   
1  00:00:04  00:09:00
1  00:05:00  01:00:59
2  00:39:00  05:23:00
2  00:23:52  06:12:31
2  00:40:50  00:00:01
3  01:05:01  00:32:00
ID   T1        T2     EarliestT2Time
1  00:00:04  00:09:00  00:09:00    
2  00:40:50  00:00:01  00:00:01
3  01:05:01  00:32:00  00:32:00
有几个步骤我想做,但如果有一个代码,可以一次完成所有这一切,这将是伟大的。首先,我想按ID分组,找出T2的最短时间。我希望在T2旁边的一个新列中输入此内容。这一部分很好,我使用的代码如下:

EarliestT2Time<-ddply(DataFirst, "ID", summarize, min=min(T2))
DataFirst$EarliestT2Time<-EarliestT2Time[,2]
ID   T1        T2     EarliestT2Time
1  00:00:04  00:09:00  00:09:00    
1  00:05:00  01:00:59  00:09:00
2  00:39:00  05:23:00  00:00:01
2  00:23:52  06:12:31  00:00:01
2  00:40:50  00:00:01  00:00:01
3  01:05:01  00:32:00  00:32:00
接下来我想按ID分组,每个ID只包含一行,其中T1在对应的T2最小值中。因此,数据帧如下所示

ID   T1        T2   
1  00:00:04  00:09:00
1  00:05:00  01:00:59
2  00:39:00  05:23:00
2  00:23:52  06:12:31
2  00:40:50  00:00:01
3  01:05:01  00:32:00
ID   T1        T2     EarliestT2Time
1  00:00:04  00:09:00  00:09:00    
2  00:40:50  00:00:01  00:00:01
3  01:05:01  00:32:00  00:32:00

感谢

一个选项是将其从chron转换为时间,获取最小值和子集的索引

library(dplyr)
library(chron)
df1 %>% 
   group_by(ID) %>%
   mutate(EarliestT2Time = T2[which.min(times(T2))])
   #or use as.POSIXct from base R
   #mutate(EarliestT2Time = T2[which.min(as.POSIXct(T2, format = "%H:%M:%S"))])

# A tibble: 6 x 4
# Groups:   ID [3]
#     ID       T1       T2 EarliestT2Time
#  <int>    <chr>    <chr>          <chr>
#1     1 00:00:04 00:09:00       00:09:00
#2     1 00:05:00 01:00:59       00:09:00
#3     2 00:39:00 05:23:00       00:00:01
#4     2 00:23:52 06:12:31       00:00:01
#5     2 00:40:50 00:00:01       00:00:01
#6     3 01:05:01 00:32:00       00:32:00