如何在R中标记特定范围的值?

时间:2017-06-29 14:58:06

标签: r

数据

我的原始数据框包含不同驱动程序更改车道的信息。每个驱动程序多次更改通道。我在车道变化点创建了一个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"))

车道变更图:

enter image description here

LC1LC2行显示这些数据中的车道变化范围。

我想做什么:

我想标记绘图中显示的值范围。这表示车道变换的完整持续时间。所以,我想要的输出是:

期望的输出:

> 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)。请指导我使用什么功能。我更喜欢使用dplyrpurrr。提前谢谢。

2 个答案:

答案 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)

使用dplyrdata.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)