Объединить строки на основе диапазонов в столбце - PullRequest
0 голосов
/ 02 октября 2018

У меня довольно большой набор данных, в котором у меня есть столбец для времени в секундах, и я хочу объединить строки, где время близко (диапазон: .1 - .2 секунды друг от друга), как среднее значение.

Вот пример того, как выглядят данные:

BPM seconds
63.9 61.899
63.9 61.902
63.8 61.910
62.1 130.94
62.1 130.95
61.8 211.59
63.8 280.5
60.3 290.4  

Итак, я бы хотел объединить первые 3 строки, затем две следующие после этого, а остальные остались бы в одиночестве.Это означает, что я хотел бы, чтобы данные выглядели так:

BPM seconds
63.9 61.904
62.1 130.95
61.8 211.59
63.8 280.5
60.3 290.4 

1 Ответ

0 голосов
/ 02 октября 2018

Нам нужно создать группы, это важный бит, остальное стандартное агрегирование:

cumsum(!c(0, diff(df1$seconds)) < 0.2)
# [1] 0 0 0 1 1 2 3 4

Затем агрегирование с использованием агрегат :

aggregate(df1[, 2], list(cumsum(!c(0, diff(df1$seconds)) < 0.2)), mean)
#   Group.1         x
# 1       0  61.90367
# 2       1 130.94500
# 3       2 211.59000
# 4       3 280.50000
# 5       4 290.40000

Или используйте dplyr :

library(dplyr)

df1 %>% 
  group_by(myGroup = cumsum(!c(0, diff(seconds)) < 0.2)) %>% 
  summarise(BPM = first(BPM),
            seconds = mean(seconds))
# # A tibble: 5 x 3
#   myGroup   BPM seconds
#     <int> <dbl>   <dbl>
# 1       0  63.9    61.9
# 2       1  62.1   131. 
# 3       2  61.8   212. 
# 4       3  63.8   280. 
# 5       4  60.3   290. 

Воспроизводимые примеры данных:

df1 <- read.table(text = "BPM seconds
                  63.9 61.899
                  63.9 61.902
                  63.8 61.910
                  62.1 130.94
                  62.1 130.95
                  61.8 211.59
                  63.8 280.5
                  60.3 290.4", header = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...