我有一堆涉及多个主题的数据(一千行),我有一个非常基本的问题,但是我不确定如何回答。以下是我的数据框的示例。
Subject Time Current.State Transition.State Transition.Event L2 L1 C R2 R1 FoodCup
14 KM6 435 16 15 0 0 0 0 0 0 0
15 KM6 455 15 4 0 0 0 0 0 0 0
16 KM6 648 4 7 3 0 0 1 0 0 0
17 KM6 658 7 14 0 0 0 0 0 0 0
18 KM6 691 14 16 8 0 0 0 0 0 1
19 KM6 698 16 0 0 0 0 0 0 0 0
20 KM6 721 16 15 0 0 0 0 0 0 0
21 KM6 741 15 4 0 0 0 0 0 0 0
22 KM6 758 4 0 0 0 0 0 0 0 1
23 KM6 762 4 0 0 0 0 0 0 0 0
24 KM6 810 4 7 6 0 0 0 0 1 0
25 KM6 814 7 0 0 0 0 0 0 0 0
26 KM6 815 7 0 0 0 0 1 0 0 0
27 KM6 819 7 0 0 0 0 1 0 0 0
28 KM6 820 7 14 0 0 0 0 0 0 0
29 KM6 821 14 0 0 0 0 0 0 0 0
30 KM6 822 14 0 0 0 0 1 0 0 0
31 KM6 824 14 0 0 0 0 0 0 0 0
32 KM6 829 14 0 0 0 0 1 0 0 0
33 KM6 862 14 16 8 0 0 0 0 0 1
34 KM6 863 16 0 0 0 0 0 0 0 1
我要完成的任务是:
在Time
和Transition.State == 7
之间传递了多少FoodCup == 1
,但仅对于最后一个FoodCup == 1
之后的第一个Transition.State == 7
。
例如,我希望能够在第16行(648)中花费时间,因为该行具有Transition.State == 7
,然后从第18行中获取时间(691),因为它是第一个{{1 }}在第16行之后,然后获得该时差的值(691-648)。但是我想完全忽略第22行,即使它有一个FoodCup == 1
,因为在它上面没有FoodCup == 1
“直接”。
期望的输出将是一个新的Transition.State == 7
,每次发生时,其时间间隔为每data.frame
(此处未显示,但实际的Subject
中有多个)< / p>
我希望这是有道理的。
谢谢!
答案 0 :(得分:0)
也许以下内容可以满足您的需求。
fun <- function(DF, want = 7){
st <- which(DF[['Transition.State']] == want)
fc <- which(DF[['FoodCup']] == 1)
i <- findInterval(fc, st)
i <- i[is.finite(i)][1]
DF[['Time']][fc[i]] - DF[['Time']][st[i]]
}
fun(df1)
#[1] 43
fun(df1, 14)
#[1] 33
dput
格式的数据。
df1 <-
structure(list(Subject = structure(c(1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L),
.Label = "KM6", class = "factor"), Time = c(435L, 455L, 648L,
658L, 691L, 698L, 721L, 741L,
758L, 762L, 810L, 814L, 815L, 819L, 820L, 821L, 822L, 824L,
829L, 862L, 863L), Current.State = c(16L, 15L, 4L, 7L, 14L,
16L, 16L, 15L, 4L, 4L, 4L, 7L, 7L, 7L, 7L, 14L, 14L, 14L,
14L, 14L, 16L), Transition.State = c(15L, 4L, 7L, 14L, 16L,
0L, 15L, 4L, 0L, 0L, 7L, 0L, 0L, 0L, 14L, 0L, 0L, 0L, 0L,
16L, 0L), Transition.Event = c(0L, 0L, 3L, 0L, 8L, 0L, 0L,
0L, 0L, 0L, 6L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 8L, 0L),
L2 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), L1 = c(0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L), C = c(0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
1L, 1L, 0L, 0L, 1L, 0L, 1L, 0L, 0L), R2 = c(0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L), R1 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), FoodCup = c(0L,
0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 1L, 1L)), class = "data.frame", row.names = c("14",
"15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25",
"26", "27", "28", "29", "30", "31", "32", "33", "34"))