首页 > 解决方案 > 从数据框/表中提取特定项目的时间戳

问题描述

我有一个由 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的所有时间戳,我很容易使用所以基本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)
 }

有什么帮助吗?

标签: rdataframetime-series

解决方案


碱基R

我们可以创建一个包含 just-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是一个返回第一个非NA参数的函数,因此它替换了我们ifelse(is.na(newcol),...)的基础 R。

数据表

library(data.table)
datDT[, newcol := fcoalesce(
    nafill(fifelse(track == "R", timestamp, NA_real_), type = "locf"),
    0)]

data.table有它自己nafill的替代对 的需要zoo::na.locf,以及它自己的fifelseand fcoalesce


推荐阅读