找到每个组的分钟

时间:2018-02-22 12:44:37

标签: r min

我试图在最短的开始时间获取FL以粘贴每个组的StartTimeFL。我使用以下代码找到了最小开始时间:

DF$StartTime<-with(DF, ave(DateTime, AlertID, FUN=min))

我拥有的数据框的一个例子是:

AlertID     DateTime                FL     StartTime               StartTimeFL
  FI         2017-06-07 23:00:45     300    2017-06-07 23:00:45    
  FI         2017-06-07 23:00:49     400    2017-06-07 23:00:45 
  FI         2017-06-07 23:00:53     300    2017-06-07 23:00:45 
  DJ         2017-05-07 03:00:00     500    2017-05-07 03:00:00
  DJ         2017-05-07 03:00:04     400    2017-05-07 03:00:00

我想要的最终数据框如下所示:

AlertID     DateTime                FL     StartTime               StartTimeFL
  FI         2017-06-07 23:00:45     300    2017-06-07 23:00:45     300    
  FI         2017-06-07 23:00:49     400    2017-06-07 23:00:45     300
  FI         2017-06-07 23:00:53     300    2017-06-07 23:00:45     300
  DJ         2017-05-07 03:00:00     500    2017-05-07 03:00:00     500
  DJ         2017-05-07 03:00:04     400    2017-05-07 03:00:00     500

到目前为止我使用的代码(如下所示)仅将StartTimeFL放在每个组的开始时间所在的行中。

DF$StartTimeFL<-with(DF, QNHCorrectedAlt[ifelse(DateTime==StartTime, TRUE,NA)])

3 个答案:

答案 0 :(得分:1)

您可以使用dplyr执行这两个步骤:

library(dplyr);
df %>%
    group_by(AlertID) %>%
    mutate(StartTime = min(as.POSIXct(DateTime)), StartTimeFL = FL[which.min(StartTime)])
## A tibble: 5 x 5
## Groups:   AlertID [2]
#  AlertID DateTime               FL StartTime           StartTimeFL
#  <fct>   <fct>               <int> <dttm>                    <dbl>
#1 FI      2017-06-07 23:00:45   300 2017-06-07 23:00:45         300
#2 FI      2017-06-07 23:00:49   400 2017-06-07 23:00:45         300
#3 FI      2017-06-07 23:00:53   300 2017-06-07 23:00:45         300
#4 DJ      2017-05-07 03:00:00   500 2017-05-07 03:00:00         500
#5 DJ      2017-05-07 03:00:04   400 2017-05-07 03:00:00         500

样本数据

df <- read.table(text = "AlertID     DateTime                FL
  FI         '2017-06-07 23:00:45'     300
  FI         '2017-06-07 23:00:49'     400
  FI         '2017-06-07 23:00:53'     300
  DJ         '2017-05-07 03:00:00'     500
  DJ         '2017-05-07 03:00:04'     400", header = T)

答案 1 :(得分:1)

以下是data.table

的解决方案
library("data.table")

DF <- fread(
"AlertID     DateTime                FL
  FI         2017-06-07_23:00:45     300
  FI         2017-06-07_23:00:49     400
  FI         2017-06-07_23:00:53     300
  DJ         2017-05-07_03:00:00     500
  DJ         2017-05-07_03:00:04     400")

DF[, StartTime:=min(DateTime), AlertID]
DF[, StartFL:=FL[DateTime==StartTime], AlertID][]
# > DF[, StartFL:=FL[DateTime==StartTime], AlertID][]
#    AlertID            DateTime  FL           StartTime StartFL
# 1:      FI 2017-06-07_23:00:45 300 2017-06-07_23:00:45     300
# 2:      FI 2017-06-07_23:00:49 400 2017-06-07_23:00:45     300
# 3:      FI 2017-06-07_23:00:53 300 2017-06-07_23:00:45     300
# 4:      DJ 2017-05-07_03:00:00 500 2017-05-07_03:00:00     500
# 5:      DJ 2017-05-07_03:00:04 400 2017-05-07_03:00:00     500

对于现有数据框DF,您可以执行以下操作:

library("data.table")
setDT(DF)
DF[, StartTime:=min(DateTime), AlertID]
DF[, StartFL:=FL[DateTime==StartTime], AlertID]
DF[]

答案 2 :(得分:0)

我找到了解决方案,所以我想分享一下。我使用了我在问题中发布的两个公式,然后继续创建一个数据框,其中包含每个AlertID的一行,包括它的开始时间和相应的FL。

UniqueIDFL<-data.frame(DF)
UniqueIDFL<-UniqueIDFL[UniqueIDFL$DateTime==UniqueIDFL$StartTime,]

然后我继续根据AlertID和Start Time将这两个数据帧合并在一起。

DF<-merge(DF, UniqueIDFL, by=c("AlertID", "StartTime"),all.x=TRUE)

可能不是最优雅的解决方案,但它完成了这项工作!