将时间戳数据转换为开始时间和结束时间
Transform timestamp data into starttimes and endtimes
我想使用 timevis、timeline 或其他包在 R 中制作时间线,但我需要将数据转换为开始时间和结束时间才能使用它。目前我有一个二分变量,表示 activity 和如下所示的时间。
Name Time Active
Joe 0 1
Joe 2 1
Joe 4 0
Joe 6 0
Joe 8 1
Joe 10 1
Beth 0 0
Beth 2 1
Beth 4 1
Beth 6 1
Beth 8 0
Beth 10 1
所以我希望能够将其转换为开始时间和结束时间,例如
Name StartTime EndTime
Joe 0 4
等等
有没有人有任何好的方法来做到这一点?
这让你入门了吗?
idxRun <- function(df, ...) {
x <- df$Active
times <- df$Time
# take a vector x and return a vector of change indicies.
dif <- diff(x) != 0
idx <- c(TRUE, dif)
dat <- list(
state=x[idx],
time=times[idx]
)
# now neatly arrange the start / stop times.
starts <- dat$time[dat$state == 1]
stops <- dat$time[dat$state == 0 & (dat$time > starts[1])]
# line up the vectors
min.len <- min(c(length(starts), length(stops)))
if(min.len == 0) {
return(data.frame(start.time = NULL, stop.time = NULL))
} else {
return(
data.frame(
start.time = starts[1:min.len],
stop.time = stops[1:min.len])
)
}
}
与 by
一起使用:
by(dd,INDICES = dd$Name, FUN=idxRun)
给出:
dd$Name: Beth
start.time stop.time
1 2 8
-------------------------------------------------------------------------------------------
dd$Name: Joe
start.time stop.time
1 0 4
我想使用 timevis、timeline 或其他包在 R 中制作时间线,但我需要将数据转换为开始时间和结束时间才能使用它。目前我有一个二分变量,表示 activity 和如下所示的时间。
Name Time Active
Joe 0 1
Joe 2 1
Joe 4 0
Joe 6 0
Joe 8 1
Joe 10 1
Beth 0 0
Beth 2 1
Beth 4 1
Beth 6 1
Beth 8 0
Beth 10 1
所以我希望能够将其转换为开始时间和结束时间,例如
Name StartTime EndTime
Joe 0 4
等等
有没有人有任何好的方法来做到这一点?
这让你入门了吗?
idxRun <- function(df, ...) {
x <- df$Active
times <- df$Time
# take a vector x and return a vector of change indicies.
dif <- diff(x) != 0
idx <- c(TRUE, dif)
dat <- list(
state=x[idx],
time=times[idx]
)
# now neatly arrange the start / stop times.
starts <- dat$time[dat$state == 1]
stops <- dat$time[dat$state == 0 & (dat$time > starts[1])]
# line up the vectors
min.len <- min(c(length(starts), length(stops)))
if(min.len == 0) {
return(data.frame(start.time = NULL, stop.time = NULL))
} else {
return(
data.frame(
start.time = starts[1:min.len],
stop.time = stops[1:min.len])
)
}
}
与 by
一起使用:
by(dd,INDICES = dd$Name, FUN=idxRun)
给出:
dd$Name: Beth
start.time stop.time
1 2 8
-------------------------------------------------------------------------------------------
dd$Name: Joe
start.time stop.time
1 0 4