从数据中提取特定项目的时间戳 frame/table
extract the timestamp of specific item from data frame/table
我有一个由 2 列和大约 12K 行组成的数据集。它有这种形式
timestamp track
0.006 A
0.185 R
0.210 A
0.221 R
0.285 A
0.387 R
0.405 R
0.412 R
0.436 A
0.458 A
0.482 A
所以我想要的是首先提取我的轨道等于 A 的所有时间戳,我使用 so base R 函数很容易做到这一点
track_data = subset(df, df$track == 'A')
track_time = track_data$V1
现在我想提取最后一首曲目的时间戳 = R 就在最后一首曲目之前 = A 如果没有找到 R 如果不放置时间戳 = 0
所以以我为例,它将是:
(0, 0.185, 0.221, 0.412, 0.412, 0.412, ...)
显然我应该有一个包含与轨道向量中 A 的数量一样多的元素的向量。
我试过做一个循环,但结果与我正在寻找的完全不兼容。
for (i in 1 : length(df$track)) {
if (df$track[i] == 'A')
x = last(df$track[i] == 'R')
vect = c(vect,x)
}
有什么帮助吗?
基础 R
我们可以创建一个仅包含 R 时间戳的向量,然后使用 zoo::na.locf
(最后的观察结转)将其级联到 A 行。
ifelse(dat$track == "R", dat$timestamp, NA)
# [1] NA 0.185 NA 0.221 NA 0.387 0.405 0.412 NA NA NA
zoo::na.locf(ifelse(dat$track == "R", dat$timestamp, NA), na.rm = FALSE)
# [1] NA 0.185 0.185 0.221 0.221 0.387 0.405 0.412 0.412 0.412 0.412
dat$newcol <- zoo::na.locf(ifelse(dat$track == "R", dat$timestamp, NA), na.rm = FALSE)
dat$newcol <- ifelse(is.na(dat$newcol), 0, dat$newcol)
dat
# timestamp track newcol
# 1 0.006 A 0.000
# 2 0.185 R 0.185
# 3 0.210 A 0.185
# 4 0.221 R 0.221
# 5 0.285 A 0.221
# 6 0.387 R 0.387
# 7 0.405 R 0.405
# 8 0.412 R 0.412
# 9 0.436 A 0.412
# 10 0.458 A 0.412
# 11 0.482 A 0.412
subset(dat, track == "A")
# timestamp track newcol
# 1 0.006 A 0.000
# 3 0.210 A 0.185
# 5 0.285 A 0.221
# 9 0.436 A 0.412
# 10 0.458 A 0.412
# 11 0.482 A 0.412
dplyr
library(dplyr)
dat %>%
mutate(
newcol = coalesce(
zoo::na.locf(if_else(track == "R", timestamp, NA_real_), na.rm = FALSE),
0)
) %>%
filter(track == "A")
coalesce
是一个 returns 第一个非 NA
参数的函数,因此它替换了我们来自基数 R 的 ifelse(is.na(newcol),...)
。
data.table
library(data.table)
datDT[, newcol := fcoalesce(
nafill(fifelse(track == "R", timestamp, NA_real_), type = "locf"),
0)]
data.table
有自己的 nafill
来代替 zoo::na.locf
,还有自己的 fifelse
和 fcoalesce
.
我有一个由 2 列和大约 12K 行组成的数据集。它有这种形式
timestamp track
0.006 A
0.185 R
0.210 A
0.221 R
0.285 A
0.387 R
0.405 R
0.412 R
0.436 A
0.458 A
0.482 A
所以我想要的是首先提取我的轨道等于 A 的所有时间戳,我使用 so base R 函数很容易做到这一点
track_data = subset(df, df$track == 'A')
track_time = track_data$V1
现在我想提取最后一首曲目的时间戳 = R 就在最后一首曲目之前 = A 如果没有找到 R 如果不放置时间戳 = 0
所以以我为例,它将是:
(0, 0.185, 0.221, 0.412, 0.412, 0.412, ...)
显然我应该有一个包含与轨道向量中 A 的数量一样多的元素的向量。
我试过做一个循环,但结果与我正在寻找的完全不兼容。
for (i in 1 : length(df$track)) {
if (df$track[i] == 'A')
x = last(df$track[i] == 'R')
vect = c(vect,x)
}
有什么帮助吗?
基础 R
我们可以创建一个仅包含 R 时间戳的向量,然后使用 zoo::na.locf
(最后的观察结转)将其级联到 A 行。
ifelse(dat$track == "R", dat$timestamp, NA)
# [1] NA 0.185 NA 0.221 NA 0.387 0.405 0.412 NA NA NA
zoo::na.locf(ifelse(dat$track == "R", dat$timestamp, NA), na.rm = FALSE)
# [1] NA 0.185 0.185 0.221 0.221 0.387 0.405 0.412 0.412 0.412 0.412
dat$newcol <- zoo::na.locf(ifelse(dat$track == "R", dat$timestamp, NA), na.rm = FALSE)
dat$newcol <- ifelse(is.na(dat$newcol), 0, dat$newcol)
dat
# timestamp track newcol
# 1 0.006 A 0.000
# 2 0.185 R 0.185
# 3 0.210 A 0.185
# 4 0.221 R 0.221
# 5 0.285 A 0.221
# 6 0.387 R 0.387
# 7 0.405 R 0.405
# 8 0.412 R 0.412
# 9 0.436 A 0.412
# 10 0.458 A 0.412
# 11 0.482 A 0.412
subset(dat, track == "A")
# timestamp track newcol
# 1 0.006 A 0.000
# 3 0.210 A 0.185
# 5 0.285 A 0.221
# 9 0.436 A 0.412
# 10 0.458 A 0.412
# 11 0.482 A 0.412
dplyr
library(dplyr)
dat %>%
mutate(
newcol = coalesce(
zoo::na.locf(if_else(track == "R", timestamp, NA_real_), na.rm = FALSE),
0)
) %>%
filter(track == "A")
coalesce
是一个 returns 第一个非 NA
参数的函数,因此它替换了我们来自基数 R 的 ifelse(is.na(newcol),...)
。
data.table
library(data.table)
datDT[, newcol := fcoalesce(
nafill(fifelse(track == "R", timestamp, NA_real_), type = "locf"),
0)]
data.table
有自己的 nafill
来代替 zoo::na.locf
,还有自己的 fifelse
和 fcoalesce
.