Создать таблицу частот с диапазонами - PullRequest
0 голосов
/ 11 октября 2018

У меня есть небольшой набор данных синхронизации оператора.Операторы 1-6 рассчитаны в своих ответах.Мне нужно создать таблицу частот для суммирования их времени отклика с интервалами в 2 секунды.

Данные выглядят так:

Operator 1 24.5
Operator 1 26.3
Operator 1 32.9
Operator 1 33.4
Operator 1 40.5
Operator 1 47.7

Желаемый результат выглядит примерно так:

Seconds Operator 1  Operator 2  Operator 3
0-2     0   2   5
3-4     1   5   3
5-6     5   0   4

Ответы [ 3 ]

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

с использованием tidyverse и cutr::smart_cut и заимствованием данных @ mysteRious:

data

set.seed(1)
ops <- sample(c("Operator 1","Operator 2","Operator 3"),100,replace=TRUE)
tms <- rnorm(100,mean=20,sd=4)
df <- as.tibble(cbind(ops,tms))
df$ops <- as.factor(df$ops)
df$tms <- as.numeric(df$tms)

решение:

library(tidyverse)
# devtools::install_github("moodymudskipper/cutr")
library(cutr)
df %>%
  mutate(Seconds = smart_cut(
    tms,list(2,0), "width", labels = ~paste0(.y[1], "-", .y[2]-1), open_end=TRUE)) %>%
  count(ops, Seconds) %>%
  spread(ops, n)

# # A tibble: 9 x 4
#   Seconds `Operator 1` `Operator 2` `Operator 3`
#   <ord>          <int>        <int>        <int>
# 1 12-13              4            2            1
# 2 14-15              2            1            4
# 3 16-17              6            7            6
# 4 18-19              7            7            8
# 5 20-21              3           10            6
# 6 22-23              1            5            4
# 7 24-25              2            3            4
# 8 26-27              1            2            1
# 9 28-29              1            1            1
0 голосов
/ 13 октября 2018

Вот решение, использующее базовую функцию R cut() для создания интервалов и функцию dcast() из пакета reshape2 для преобразования из длинного в широкоформатный формат, что приводит к увеличению (подсчету):

# create sample dataset
set.seed(123L)
n_row <- 100L
df <- data.frame(
  ops = sample(c("Operator 1", "Operator 2", "Operator 3"), n_row, replace = TRUE),
  tms = rnorm(n_row, mean = 20, sd = 4))


# define parameter
intval <- 2
# create pretty breaks depending on range of response times
breaks <-with(df, 
              seq(floor(min(tms) / intval) * intval, max(tms) + intval, intval))
# reshape from long to wide format and aggregate by interval
library(reshape2)
dcast(df, cut(tms, breaks) ~ ops, length, value.var = "tms")
   cut(tms, breaks) Operator 1 Operator 2 Operator 3
1           (10,12]          1          0          1
2           (12,14]          1          4          1
3           (14,16]          2          4          3
4           (16,18]          5          7          3
5           (18,20]          9          3          9
6           (20,22]          5          9          7
7           (22,24]          5          2          4
8           (24,26]          3          2          3
9           (26,28]          1          2          1
10          (28,30]          1          1          1
0 голосов
/ 12 октября 2018

Я смоделировал некоторые данные, которые похожи на ваши данные, чтобы показать вам, как это сделать.Вам нужно будет установить пакеты tibble, magrittr и dplyr для труб %>% и функций для правильной работы:

Начните с этого:

library(tibble)
library(magrittr)
library(dplyr)

# simulate data
ops <- sample(c("Operator 1","Operator 2","Operator 3"),100,replace=TRUE)
tms <- rnorm(100,mean=20,sd=4)
df <- as.tibble(cbind(ops,tms))
df$ops <- as.factor(df$ops)
df$tms <- as.numeric(df$tms)

Затем отсортируйте df по заданным вами ячейкам (измените код после breaks, чтобы получить его так, как вы хотите, исходя из характеристик ваших временных данных):

> results <- df %>% group_by(ops) %>% 
    mutate(category=cut(tms, breaks=c(-Inf,0,10,20,30,Inf), 
    labels=c("-Inf-0 sec","0-10 sec","10-20 sec","20-30 sec","30-Inf sec")))
> results
# A tibble: 100 x 3
# Groups:   ops [3]
   ops          tms category 
   <fct>      <dbl> <fct>    
 1 Operator 1  16.6 10-20 sec
 2 Operator 2  25.1 20-30 sec
 3 Operator 3  20.4 20-30 sec
 4 Operator 1  19.7 10-20 sec
 5 Operator 3  23.6 20-30 sec
 6 Operator 3  22.6 20-30 sec
 7 Operator 1  14.6 10-20 sec
 8 Operator 3  19.6 10-20 sec
 9 Operator 3  22.3 20-30 sec
10 Operator 2  18.1 10-20 sec
# ... with 90 more rows

И вы можете проверитьданные в указанном выше формате, например:

> table(results$ops,results$category)

             -Inf-0 sec 0-10 sec 10-20 sec 20-30 sec 30-Inf sec
  Operator 1          0        0        24        13          1
  Operator 2          0        0        13        13          0
  Operator 3          0        0        12        24          0

или

> table(results$category,results$ops)

             Operator 1 Operator 2 Operator 3
  -Inf-0 sec          0          0          0
  0-10 sec            0          0          0
  10-20 sec          23         22         18
  20-30 sec          12         13         12
  30-Inf sec          0          0          0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...