我有一个大数据集,其中包含一个时间列和一个标识眼球扫视或注视的列(扫视=快速眼动,注视=相对稳定的眼动)。我想通过将第一个“ f”的开始到第一个“ s”的开始之间的时间计算出来,来计算注视和扫视每个周期持续多长时间。因此,如果有3个连续的带有“ s”的行,我希望它花费列[i]中第一个“ s”出现的时间,而列[i]中最后一个“ s”出现在下一个“”之前的时间F”。通过分散这2次,我知道了每个注视和扫视周期的持续时间。
时间刻度不是连续的,因为有时行会由于数据闪烁而被删除。
example.df <- data.frame(time = seq(1:100),
saccade = sample(letters[c(6, 19)], 100, replace = T))
有一种简单的方法吗?
非常感谢
答案 0 :(得分:1)
我们可以使用rle()
创建一个索引,然后group_by()
将该索引复制到sum()
的{{1}}:
time
答案 1 :(得分:1)
结果作为data.frame:
example.df <- data.frame(time = seq(1:100),
saccade = sample(letters[c(6, 19)], 100, replace = T),
stringsAsFactors = FALSE)
run_len_encoding <- rle(example.df$saccade)
length_of_runs <- run_len_encoding$length
index_of_changes <- cumsum(length_of_runs)
duration <- diff(c(1,index_of_changes),1)
result.df <- data.frame(duration, state = run_len_encoding$values)
result.df
duration state
1 1 s
2 2 f
3 1 s
4 4 f
5 1 s
6 3 f
7 3 s
8 2 f
9 3 s
10 1 f
11 2 s
12 1 f
13 1 s
14 2 f
15 4 s
16 1 f
17 2 s
18 1 f
19 1 s
20 1 f
21 1 s
22 1 f
23 2 s
24 1 f
25 2 s
26 3 f
27 1 s
28 1 f
29 2 s
30 1 f
31 1 s
32 1 f
33 6 s
34 1 f
35 3 s
36 3 f
37 1 s
38 2 f
39 2 s
40 4 f
41 1 s
42 1 f
43 1 s
44 1 f
45 1 s
46 2 f
47 1 s
48 3 f
49 2 s
50 1 f
51 4 s
52 1 f
53 1 s
54 1 f
55 2 s