从数据中提取特定项目的时间戳 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,还有自己的 fifelsefcoalesce.