r - 如何标记R中特定行周围的任何值范围?

标签 r dataframe dplyr tidyverse tidyr

这是 this one 的后续问题.

数据

x <- data.frame(file.ID = "Car1", 
                frames = 1:15, 
                lane.change = c("no", "no", "no", "yes", 
                                "no", "no", "no", "no", 
                                "no", "yes", "no", "no", "no", "no", "no"))

问题

我想在给定 文件的每次换道中标记 few 行上方和 lane.change=="yes" 行之后的几行。 ID 组。上一个问题的答案适用于连续行,但不适用于任意数量的行。我尝试在 leadlag 函数中提供参数 n 但它没有给出想要的结果。

期望的输出

理想情况下,我希望能够在 lane.change=="yes" 之前和之后标记任意数量的行。在我的原始数据框中,我想在之前和之后标记 800 行。但在示例数据框 x 我试图标记 2。所以所需的输出应该是:

   file.ID frames lane.change range_LC
1     Car1      1          no        .
2     Car1      2          no      LC1
3     Car1      3          no      LC1
4     Car1      4         yes      LC1
5     Car1      5          no      LC1
6     Car1      6          no      LC1
7     Car1      7          no        .
8     Car1      8          no      LC2
9     Car1      9          no      LC2
10    Car1     10         yes      LC2
11    Car1     11          no      LC2
12    Car1     12          no      LC2
13    Car1     13          no        .
14    Car1     14          no        .
15    Car1     15          no        .

请帮助我获得所需的输出。由于原始数据有多个 file.ID,我更喜欢 dplyr 解决方案,因为我以后可以使用 group_by。谢谢。

编辑

我想概括多个 file.ID 的代码。您可以下载包含 2 个 file.ID 的原始数据帧的子集,here .我尝试了以下(感谢@G5W的解决方案):

library(tidyr)
by_file.ID <- c %>% 
  group_by(file.ID) %>% 
  nest()

library(purrr)
by_file.ID <- by_file.ID %>% 
  mutate(range_LC = map(data, ~ ".")) %>% 
  mutate(Changes = map(data, ~ tail(which(.$lane.change=="yes"),-1)))   

请注意,在每种情况下,第一次变道的索引号都非常小。所以,我通过 tail(which(...), -1) 跳过它。另外,请注意,在这些数据中,我想在换道行前后使用 800 行。因此,单个 file.ID 的代码应该是这样的:

range_LC[t(outer(Changes, -800:800, '+'))] = rep(1:length(Changes), each=1601)

上面的代码是我不知道如何应用到 file.ID 组的主要代码。我考虑过将 for 循环do.call() 一起使用,但由于大量的车道变化和 file.ID,它可能会很慢s。

感谢您花费时间和精力帮助我。

最佳答案

这只需要仔细索引数组。

x$range_LC = "."
Changes = which(x$lane.change == "yes")
x$range_LC[t(outer(Changes, -2:2, '+'))] = rep(1:length(Changes), each=5)
x
   file.ID frames lane.change range_LC
1     Car1      1          no        .
2     Car1      2          no        1
3     Car1      3          no        1
4     Car1      4         yes        1
5     Car1      5          no        1
6     Car1      6          no        1
7     Car1      7          no        .
8     Car1      8          no        2
9     Car1      9          no        2
10    Car1     10         yes        2
11    Car1     11          no        2
12    Car1     12          no        2
13    Car1     13          no        .
14    Car1     14          no        .
15    Car1     15          no        .

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

相关文章:

python KDE 将轮廓和路径转换为特定的 json 格式 leaflet-friendly

python - 如何使用 Pandas 查找两个不同日期时间之间的最小值?

r - dplyr::group_by 两列相同的变量,顺序无关紧要

r - 在分组的时间序列中填充缺失的日期-tidyverse方法?

r - 将一组点与 R 中的线连接起来

r - R中函数的计算周期

python - 什么是相当于 R 的 `with` 的 python/pandas?

python - 为了清楚起见,如何在 pandas DataFrame 中 "name"列/行?

python - pandas DataFrame中设置索引的问题

r - 有没有办法将 dplyr 的 `do` 函数传递给附加参数的向量?