首页 > 解决方案 > 在R中,根据其他行中的值取两行中的值之间的差异,具有特定要求

问题描述

我有一堆(1000 多行)数据,其中包含多个主题,我有一个非常基本的问题,但我非常不确定如何回答它。下面是我的数据框的示例。

     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

我要完成的任务是:

a和 aTime之间传递了多少,但仅适用于自上一个以来的第一个。Transition.State == 7FoodCup == 1FoodCup == 1Transition.State == 7

例如,我希望能够在第 16 行(648)中花费时间,因为该行有 a Transition.State == 7,然后从第 18 行中花费时间(691),因为它是第FoodCup == 116 行之后的第一个,然后得到那个时差 (691-648)。但我想完全忽略第 22 行,即使它有FoodCup == 1, 因为它上面没有Transition.State == 7“直接”。

所需的输出将是新data.frame的,每次出现 this 时都有时间差Subject(此处未显示,但实际dfs 中有多个)

我希望这是有道理的。

谢谢!

标签: rdplyr

解决方案


也许像下面这样的东西会做你想要的。

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

推荐阅读