/ / porovnajte agregovanú hodnotu medzi skupinami - r, dplyr

porovnať súhrnnú hodnotu medzi skupinami - r, dplyr

Ak df je nižšie,

  1. potreba vypočítať strednú hodnotu pre premennú metric cez tímy tm1, tm2 a tm3 na locid, day, hour kombinovaný základ
  2. potom filtrujte iba tie locid, day, hour pozorovania, ktoré majú to isté metric medián naprieč tímami tm1, tm2, tm3.

    set.seed(100)
    df <- data.frame(
    locid = sample(c(1111,1122,1133), 20, replace=TRUE),
    day = sample(c(1:3), 20, replace=TRUE),
    hour = sample(c(1:4), 20, replace=TRUE),
    team = sample(c("tm1", "tm2", "tm3"), 20, replace=TRUE),
    metric = sample(1:5, 20, replace=TRUE )
    )
    

môj pokus

df_medians <- df %>%
group_by(locid + day + hour + team) %>%
summarise(metric_median = median(metric))

to dáva median za team pre každý locid + day + hour, Musím teraz zistiť locid + day + hour kombá, ktoré dávajú rovnakú strednú hodnotu naprieč tímami tm1, tm2, tm3.

df_medians %>% group_by(locid, day, hour, team) %>% summarise(??what here??)

Snažil som sa s lupičom, ale základné riešenie je v poriadku.

Ako jednoduchší príklad sa môžeme pozrieť na nižšie uvedené údaje, ktoré majú merania z dvoch rôznych miest pre dva tímy.

+-------+------+-------+-------+---------+
| locid |  day |  hour |  team |  metric |
+-------+------+-------+-------+---------+
|  1111 |    1 |     1 |  tm1  |       3 |
|  1111 |    1 |     1 |  tm1  |       2 |
|  1111 |    1 |     1 |  tm1  |       1 |

|  1111 |    1 |     1 |  tm2  |       1 |
|  1111 |    1 |     1 |  tm2  |       2 |
|  1111 |    1 |     1 |  tm2  |       3 |

|  1122 |    1 |     1 |  tm1  |       3 |
|  1122 |    1 |     1 |  tm1  |       2 |
|  1122 |    1 |     1 |  tm1  |       1 |

|  1122 |    1 |     1 |  tm2  |       1 |
|  1122 |    1 |     1 |  tm2  |       2 |
|  1122 |    1 |     1 |  tm2  |       1 |
+-------+------+-------+-------+---------+

Krok 1 - výpočet mediánu podľa skupiny

+-------+------+-------+-------+-------------+
| locid |  day |  hour |  team |  metric_med |
+-------+------+-------+-------+-------------+
|  1111 |    1 |     1 |  tm1  |       2     |
|  1111 |    1 |     1 |  tm2  |       2     |
|  1122 |    1 |     1 |  tm1  |       2     |
|  1122 |    1 |     1 |  tm2  |       1     |
+-------+------+-------+-------+-------------+

Krok 2 - porovnajte mediány iba v skupine (locid + deň + hodina) (1111, 1, 1) má metric_med to isté v tímoch gp1 a gp2

+-------+------+-------+-------------+
| locid |  day |  hour |  metric_med |
+-------+------+-------+-------------+
|  1111 |    1 |     1 |       2     |
+-------+------+-------+-------------+

odpovede:

0 pre odpoveď č. 1

Jedným zo spôsobov, ako to urobiť, je rozdeliť skupiny do jedného riadku na každú locid, deň a hodinu a potom ich porovnať. Toto riešenie je vhodné pre viac ako dve skupiny a komplikované podmienky.

library(dplyr)
library(tidyr)

data %>%
group_by(locid, day, hour, team) %>%
summarize(median = median(metric)) %>%
spread(team, median) %>%
filter(tm1 == tm2)

Ďalším možným riešením je usporiadať zhrnuté výsledky podľa hodín, dňa a hodiny a potom porovnať medián v jednom riadku s jeho lag, Toto riešenie funguje iba pre dve skupiny v tíme.

data %>%
group_by(locid, day, hour, team) %>%
summarize(median = median(metric)) %>%
arrange(locid, day, hour) %>%
filter(median == lag(median))

0 pre odpoveď č. 2

Nech je „prepracované“ všetko rovnaké, čo znamená „nulové rozptyl alebo jediné pozorovanie“.

df %>% # per locid, day, hour, team group_by(locid, day, hour, team) %>% # compute median summarize(team_median = median(metric)) %>% # ungroup before specifying new grouping ungroup %>% # for locid, day, hour group_by(locid, day, hour) %>% # find the medians that were the same for all teams # "the same" here is taken to mean no variance # or having a single observation # note that, although logical vector TRUE | NA does yield TRUE # this is only because it must yield TRUE. # As another example, FALSE | NA, yields NA. # As a guard against team_medians that are NA, I add a coalesce wrapper. # I"ve decided that missing team_medians represent non-cases, YMMV summarize(all_equal = coalesce(n() == 1 | var(team_median) == 0), FALSE) %>% filter(all_equal == TRUE) %>% select(-all_equal)