Расчет времени в зависимости от строковой переменной в другом столбце - PullRequest
0 голосов
/ 19 сентября 2018

У меня большой набор данных, который содержит столбец времени и столбец с идентификацией саккады или фиксации глаза (саккада = быстрое движение глаза, фиксация = относительно стабильное движение глаза).Я хочу вычислить, как долго длится каждый период фиксаций и саккад, принимая время с начала первого «f» до первых «s» и так далее.Таким образом, если есть 3 последовательных строки с «s», я хочу, чтобы это заняло время в столбце [i], где появились первые «s», и время в столбце [i], где последние «s» появились перед следующим »е».Отвлекая их 2 раза, я знаю продолжительность каждой фиксации и периода саккады.

Шкала времени не является непрерывной, поскольку иногда строки удаляются из-за мигания данных.

example.df <- data.frame(time = seq(1:100), 
                         saccade = sample(letters[c(6, 19)], 100, replace = T))

Есть ли простой способ сделать это?

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Результат как 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
0 голосов
/ 19 сентября 2018

Мы можем создать индекс, используя rle(), а затем group_by() этот индекс до sum() time:

library(tidyverse)

example.df <- data.frame(time = seq(1:100), 
                         saccade = sample(letters[c(6, 19)], 100, replace = T))

test <- rle(example.df$saccade == "s")

example.df$indexer <- rep(1:length(test$lengths), test$lengths)

example.df <- example.df %>%
  group_by(indexer) %>%
  mutate(period = time[n()] - time[1])

# A tibble: 100 x 4
# Groups:   indexer [53]
    time saccade indexer period
   <int>  <fctr>   <int>  <int>
 1     1       s       1      1
 2     2       s       1      1
 3     3       f       2      0
 4     4       s       3      0
 5     5       f       4      3
 6     6       f       4      3
 7     7       f       4      3
 8     8       f       4      3
 9     9       s       5      1
10    10       s       5      1
# ... with 90 more rows

# drop indexer column
example.df <- example.df[setdiff(names(example.df),"indexer")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...