r - 在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 == 7
FoodCup == 1
FoodCup == 1
Transition.State == 7
例如,我希望能够在第 16 行(648)中花费时间,因为该行有 a Transition.State == 7
,然后从第 18 行中花费时间(691),因为它是第FoodCup == 1
16 行之后的第一个,然后得到那个时差 (691-648)。但我想完全忽略第 22 行,即使它有FoodCup == 1
, 因为它上面没有Transition.State == 7
“直接”。
所需的输出将是新data.frame
的,每次出现 this 时都有时间差Subject
(此处未显示,但实际df
s 中有多个)
我希望这是有道理的。
谢谢!
解决方案
也许像下面这样的东西会做你想要的。
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"))
推荐阅读
- laravel - Laravel 自定义守卫排除路线
- apple-music - Apple Music 用户令牌是否会因每次身份验证而改变?
- java - 如何避免在 Oracle 中使用多线程进行双重插入
- spring-boot - 即使从不存在的配置文件开始,Spring Boot 也会启动
- javascript - js 将函数设置为变量或匿名函数返回函数
- php - 使用会话数据进行测试以在刀片页面中显示照片
- java - Java 泛型通配符 - 我如何在这里使用泛型与 Lambda?
- ionic-framework - 如何将 Ziggeo Sdk 集成到 Ionic App
- python - 如何从 python 脚本访问中运行保存的更新查询?
- android - 在 Room 中获取今天的费用