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

时间:2017-11-24 16:06:16

标签: 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分组并找到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     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

由于

1 个答案:

答案 0 :(得分:1)

一个选项是将其从COALESCE()转换为COALESCE(expr1, expr2, ...., expr_n),获取最小值和子集的索引

times

如果我们只想包含一行,请执行chronlibrary(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

slice