根据其他列中的字符串变量计算时间

时间:2018-09-19 10:32:47

标签: r dataframe time

我有一个大数据集,其中包含一个时间列和一个标识眼球扫视或注视的列(扫视=快速眼动,注视=相对稳定的眼动)。我想通过将第一个“ 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))

有一种简单的方法吗?

非常感谢

2 个答案:

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