在R中,根据其他要求,根据其他行中的值取两行中的值之差

时间:2019-03-17 16:22:57

标签: r dplyr

我有一堆涉及多个主题的数据(一千行),我有一个非常基本的问题,但是我不确定如何回答。以下是我的数据框的示例。

     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

我要完成的任务是:

TimeTransition.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>

我希望这是有道理的。

谢谢!

1 个答案:

答案 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"))