这是 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"
行之后的几行。 IDlead
和 lag
函数中提供参数 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/