Ak df je nižšie,
- potreba vypočítať strednú hodnotu pre premennú
metric
cez tímy tm1, tm2 a tm3 nalocid
,day
,hour
kombinovaný základ potom filtrujte iba tie
locid
,day
,hour
pozorovania, ktoré majú to istémetric
medián naprieč tímamitm1
,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ď č. 1Jedný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)