Я хочу сгруппировать все события, произошедшие за определенный промежуток времени. В столбце «Интервал.Макс» отображается время окончания интервала.

    Interval.Max       Event.Time
    1            7.5              0.4
    2           12.0              3.7
    3           19.3              5.2
    4             NA              9.1
    5             NA              9.8
    6             NA             11.7
    7             NA             12.9
    8             NA             14.9
    9             NA             17.0
    10            NA             19.1
              

Моя цель - получить что-то вроде этого:

    Interval.Max       Event.Time         Group
    1            7.5              0.4             1
    2           12.0              3.7             1
    3           19.3              5.2             1
    4             NA              9.1             2
    5             NA              9.8             2
    6             NA             11.7             2
    7             NA             12.9             3
    8             NA             14.9             3
    9             NA             17.0             3
    10            NA             19.1             3
   

Или же:

    Interval.Max    Event Onset Time
    7.5                          0.4
    7.5                          3.7
    7.5                          5.2
    12                           9.1
    12                           9.8
    12                          11.7
    19.3                        12.9
    19.3                        14.9
    19.3                          17
    19.3                        19.1
   

Как мне это сделать в R?

Благодарность!

1
janina 3 Май 2021 в 03:58

1 ответ

Лучший ответ

Мы можем использовать cut/findInterval для создания группы

df1$Group <- with(df1, as.integer(cut(Event.Time,
           breaks = c(-Inf, na.omit(Interval.Max)))))

-вывод

df1
   Interval.Max Event.Time Group
1           7.5        0.4     1
2          12.0        3.7     1
3          19.3        5.2     1
4          24.4        9.1     2
5          27.0        9.8     2
6          31.8       11.7     2
7            NA       12.9     3
8            NA       14.9     3
9            NA       17.0     3
10           NA       19.1     3
11           NA       19.4     4
12           NA       22.2     4
13           NA       23.7     4
14           NA       24.9     5
15           NA       25.7     5
16           NA       26.1     5
17           NA       26.8     5
18           NA       28.2     6
19           NA       29.5     6
20           NA       31.7     6

Или, если нам нужен второй выход

df1$Interval.Max <- with(df1, 
         na.omit(Interval.Max)[as.integer(cut(Event.Time,
                     breaks = c(-Inf, na.omit(Interval.Max))))])

Данные

df1 <- structure(list(Interval.Max = c(7.5, 12, 19.3, 24.4, 27, 31.8, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), Event.Time = c(0.4, 
3.7, 5.2, 9.1, 9.8, 11.7, 12.9, 14.9, 17, 19.1, 19.4, 22.2, 23.7, 
24.9, 25.7, 26.1, 26.8, 28.2, 29.5, 31.7)), class = "data.frame",
row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20"))
0
akrun 3 Май 2021 в 01:06