這是this one的後續問題。如何標記R中特定行的任何值的範圍?
數據
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"))
問題
我想在一個給定的file.ID
組中的每個車道變更lane.change=="yes"
行後標記幾行以上和幾行。上一個問題的答案適用於連續行,但不適用於任何行數。我嘗試在lead
和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
s,我更喜歡dplyr
解決方案,因爲我稍後可以使用group_by
。謝謝。
編輯
我想概括爲多個file.ID
是代碼。您可以下載包含2個file.ID
s,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
S中的組。我想過使用for loop
與do.call()
,但由於大量換道和file.ID
s,它可能會非常緩慢。
感謝您的時間和精力幫助我。
當你指定一個大數字時,你如何處理潛在的重疊?例如,如果將x指定爲3,第7行是「LC1」還是「LC2」? – www
@ycw,這在原始數據幀中不是問題,因爲車道變化總是有大量的行之間。所以,在這種情況下,2行很好。 –
爲此使用'滯後'。 – Masoud