r - 从数据框/表中提取特定项目的时间戳
问题描述
我有一个由 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)
}
有什么帮助吗?
解决方案
碱基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
,以及它自己的fifelse
and fcoalesce
。
推荐阅读
- c++ - emplace_back 一个包含互斥体的对象
- ngrx-entity - 当一个子减速器依赖于适配器时,如何将选择器与 combineReducers 一起使用?
- python - 阅读 AVL 数据 TELTONIKA
- xml - 这个简单的 XML 有什么问题?
- typescript - 如何使用 Rollup.js 将绝对导入转换为相对导入?
- python - 如何设置 docker compose 以使用 ssh 通过 EC2 Bastion 连接到私有子网上的 AWS RDS
- c - 如何处理这种冲突的类型错误
- r - 将多图 ggplots 与拼凑和单个图例对齐
- mysql - 如何在 MySQL 上每天进行多表更新查询
- android - Android NDK 在线程内不打印