gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:20:08 25 4
gpt4 key购买 nike

数据

我的原始数据框包含不同司机变换车道的信息。每个司机都会多次变道。我创建了一个 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

我尝试过的和遇到的问题:

我知道我可以使用 x[which(x$lane.change=="yes"),"frames"] 引用相关的 frames。但目标是为每次变道标记上一行和下一行。我坚持如何做到这一点。此外,我想将它应用到所有司机(在原始数据中),每个司机都有不同的变道次数(>=2)。请指导我使用什么功能。我更喜欢使用 dplyrpurrr。提前致谢。

最佳答案

首先我会做一些辅助函数

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

关于r - 如何在 R 中标记特定范围的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44828658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com