Как агрегировать данные с 5-минутным интервалом для каждой группы? - PullRequest
0 голосов
/ 08 июня 2019

Вот мои данные.

a <-
structure(list(timestamp1.x = c("2019-05-31 18:27:34", "2019-05-31
18:28:34",  "2019-05-31 18:29:34", "2019-05-31 18:29:59", "2019-05-31
18:35:35",  "2019-05-31 18:35:43", "2019-05-31 18:41:43", "2019-05-31
18:42:45",  "2019-05-31 18:49:34", "2019-05-31 18:50:34"), sensor =
c("A",  "A", "A", "A", "B", "B", "C", "C", "A", "A"), direction =
c(-75, 
-78, -58, -54, -72, -47, -57, -51, -75, -78)), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))

Я хотел бы объединить данные с 5-минутным интервалом для каждого датчика. Это пробная версия.

aa <- a %>%
  mutate(timestamp1.x = as.POSIXct(timestamp1.x, format = "%Y-%m-%d %H:%M:%S")) %>%
  group_by(sensor, timestamp1.x = cut(timestamp1.x, breaks="5 min")) %>%
  summarize(mean_direction = mean(direction))

И это таблица результатов.

  sensor timestamp1.x        mean_direction
  <chr>  <fct>                        <dbl>
1 A      2019-05-31 18:27:00          -66.2
2 A      2019-05-31 18:47:00          -76.5
3 B      2019-05-31 18:32:00          -59.5
4 C      2019-05-31 18:37:00          -57  
5 C      2019-05-31 18:42:00          -51  

Однако я хотел бы объединить его для каждой группы (датчика).

Это означает, что в случае датчика A данные должны быть агрегированы с 18:27:00 до 18:31:59 (5-минутный интервал). Для датчика B данные с 18:35:00 до 18:39:49 (5-минутный интервал) должны быть агрегированы.

Это результат, который я хочу.

  sensor timestamp1.x        mean_direction
  <chr>  <fct>                        <dbl>
1 A      2019-05-31 18:27:00          -66.2
2 A      2019-05-31 18:49:00          -76.5
3 B      2019-05-31 18:35:00          -59.5
4 C      2019-05-31 18:41:00          -54

Как добавить некоторые функции и опции в 'group_by' или другие коды?

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Вам необходимо последовательно добавить группировки. Итак, сначала group_by(sensor), а затем group_by(timestamp1.x = cut(...), add = T).

a%>%
  mutate(timestamp1.x = as.POSIXct(timestamp1.x))%>%
  group_by(sensor)%>%
  group_by(timestamp1.x = as.character(cut(timestamp1.x, breaks="5 min")),add = T)%>%
  summarize(mean_direction = mean(direction))

Редактировать: Добавлено as.character в групповом вызове. Раньше было бы пропущено поле sensor во время summarize. Это работает как задумано сейчас.

1 голос
/ 08 июня 2019

Следующее делает то, что просит вопрос.
Хитрость заключается в том, чтобы сгруппировать только по sensor, затем cut по timestamp1.x, затем сгруппировать по sensor и timestamp1.x.

bb <- b %>%
  mutate(timestamp1.x = as.POSIXct(timestamp1.x, format = "%Y-%m-%d %H:%M:%S")) %>%
  group_by(sensor) %>%
  mutate(timestamp1.x = as.character(cut(timestamp1.x, breaks="5 min"))) %>%
  ungroup() %>%
  group_by(sensor, timestamp1.x) %>%
  summarize(mean_direction = mean(direction)) 

Код создания данных.

set.seed(1234)
n <- 100
timestamp1.x <- as.POSIXct("2019-05-31 00:00:00") + cumsum(sample(60, n, TRUE))
sensor <- sample(LETTERS[1:3], n, TRUE)
direction <- sample(0:-100, n, TRUE)
b <- data.frame(timestamp1.x, sensor, direction)
b <- b[with(b, order(sensor, timestamp1.x)), ]
row.names(b) <- NULL
...