我的原始数据框包含不同驱动程序更改车道的信息。每个驱动程序多次更改通道。我在车道变化点创建了一个lane.change
列,其中包含yes
。以下是一个示例数据框,其中包含单个驱动程序的2个通道更改:
x <- structure(list(file.ID = structure(c(1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L), class = "factor", .Label = "Car1"), frames = 1:11,
lane.change = structure(c(1L, 1L, 1L, 2L, 1L, 1L, 1L, 2L,
1L, 1L, 1L), .Label = c("no", "yes"), class = "factor"),
y.m = c(80, 80, 80, 81, 82, 82, 82, 83, 84, 84, 84)), row.names = c(NA,
-11L), class = "data.frame", .Names = c("file.ID", "frames",
"lane.change", "y.m"))
LC1
和LC2
行显示这些数据中的车道变化范围。
我想标记绘图中显示的值范围。这表示车道变换的完整持续时间。所以,我想要的输出是:
> x
file.ID frames lane.change range_LC y.m
1 Car1 1 no . 80
2 Car1 2 no . 80
3 Car1 3 no LC1 80
4 Car1 4 yes LC1 81
5 Car1 5 no LC1 82
6 Car1 6 no . 82
7 Car1 7 no LC2 82
8 Car1 8 yes LC2 83
9 Car1 9 no LC2 84
10 Car1 10 no . 84
11 Car1 11 no . 84
我知道我可以使用frames
来引用相关的x[which(x$lane.change=="yes"),"frames"]
。但目标是为每个车道变更标记上一行和下一行。我被困在如何做到这一点。另外,我想将它应用于所有驱动程序(在原始数据中),每个驱动程序具有不同的车道变换次数(&gt; = 2)。请指导我使用什么功能。我更喜欢使用dplyr
和purrr
。提前谢谢。
答案 0 :(得分:4)
首先,我要做一些辅助功能
is_changing <- function(x) {
x !=lag(x, default=first(x)) | x != lead(x, default=last(x))
}
此函数基本上是为了查看向量中的任何特定值是否在不同的值旁边(增加或减少)。
下一个函数采用TRUE / FALSE值的向量,并为每个TRUE值运行分配一个新索引。
true_run_index <- function(x) {
r<-rle(x)
v<-r$values
v[v] <- seq.int(sum(v))
v[v==0]<-NA
rep(v, r$length)
}
然后我们可以将那些与您的样本数据一起使用
x %>% mutate(LC = true_run_index(is_changing(lane.change)))
x %>% mutate(LC = true_run_index(is_changing(y.m)))
# file.ID frames lane.change y.m LC
# 1 Car1 1 no 80 NA
# 2 Car1 2 no 80 NA
# 3 Car1 3 no 80 1
# 4 Car1 4 yes 81 1
# 5 Car1 5 no 82 1
# 6 Car1 6 no 82 NA
# 7 Car1 7 no 82 2
# 8 Car1 8 yes 83 2
# 9 Car1 9 no 84 2
# 10 Car1 10 no 84 NA
# 11 Car1 11 no 84 NA
答案 1 :(得分:1)
使用dplyr
和data.table
中的函数的解决方案。 x4
是最终输出。
library(dplyr)
library(data.table)
x2 <- x %>%
mutate(LC_ID = rleid(lane.change)/2) %>%
mutate(LC_ID2 = ifelse(LC_ID %% 1 == 0, paste0("LC", LC_ID), NA)) %>%
mutate(LC_ID3 = lag(LC_ID2), LC_ID4 = lead(LC_ID2))
x3 <- mutate(x2, range_LC = coalesce(x2$LC_ID2, x2$LC_ID3, x2$LC_ID4, "."))
x4 <- x3 %>% select(file.ID, frames, lane.change, range_LC, y.m)