【问题标题】:extract the timestamp of specific item from data frame/table从数据框/表中提取特定项目的时间戳
【发布时间】:2021-12-09 06:16:37
【问题描述】:

我有一个由 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 dataframe time-series


    【解决方案1】:

    基础 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 的函数,因此它替换了我们从基础R 中的ifelse(is.na(newcol),...)

    数据表

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

    data.table 有自己的nafill 来代替zoo::na.locf 的需要,还有自己的fifelsefcoalesce

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-29
      • 2015-11-20
      • 1970-01-01
      • 2020-10-21
      • 2012-04-22
      相关资源
      最近更新 更多