我试图在最短的开始时间获取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)])
答案 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)
可能不是最优雅的解决方案,但它完成了这项工作!