Vytvořit dummy pro skupiny-specifické maximální hodnoty výskytu podmíněna celkovou maximální

0

Otázka

Předpokládejme, že mám dataset podobné této:

library(tidyverse)
library(lubridate)

state <- c(rep("Alabama", 10), rep("Arizona", 10), rep("Arkansas", 10))
county <- c(rep("Baldwin", 5), rep("Barbour", 5), rep("Apache", 5), rep("Cochise", 5), rep("Arkansas", 5), rep("Ashley", 5))
date <- rep(seq(ymd('2012-04-06'),ymd('2012-04-10'),by='days'), 6)
stray_dogs <- c(lag(1:3, n = 2, default = 0), floor(runif(7, min=1, max=4)),
                   lag(1:6, n = 5, default = 0), floor(runif(4, min=1, max=18)),
                   lag(1:2, n = 1, default = 0), floor(runif(8, min=1, max=4)))

df <- data.frame(state, county, date, stray_dogs) %>% 
  mutate(stray_dogs_max = max(stray_dogs)) %>% 
  mutate(most_stray_dogs = case_when(stray_dogs_max == stray_dogs ~ 1,
                                      stray_dogs_max != stray_dogs ~ 0))

Chtěl bych najít datum, kdy nejvyšší počet toulavých psů byly nalezeny v každém kraji prostřednictvím group_by(state, county) nebo něco podobného a vytvořit dichotomické proměnné (sloupec), který má hodnotu 1 pro daný den (a trvá 0 po zbytek dní). Nicméně, když tam byly žádné toulavých psů na všechny v určitém okrese v průběhu období, by to mělo označit jako den 1 když most_stray_dogs se rovná 1, a když tam jsou několik dní se stejným počtem toulavých psů v rámci okresu, je třeba vybrat den, který je blíže ke dni most_stray_dogs == 1.

Pro ten kousek, moje intuice by bylo použít helper vektor, vytvořený s difftime; nicméně já prostě nemůžu dát dohromady všechny tyto najednou. Jak mám vytvořit v tomto sloupci?

dplyr lubridate r
2021-11-23 18:51:03
1

Nejlepší odpověď

0

Myslím, že to funguje. Žádná "správná odpověď" je k dispozici, a dat je dost velký na to, aby to těžké bulvy, takže si nejsem pozitivní, ale to je metodický takže by to mělo alespoň vám na správné cestě.

Výpočet data rozdíl jsem svévolně odečte 0.1 jako tie-breaker mezi stejný počet dnů před a po národní max. Pak jsem arrange každé skupině přiřadit nejlepší volba (což je trochu neefektivní, ale měl by být dostatečně rychlý).

df %>% arrange(state, county, date) %>%
  group_by(date) %>%
  mutate(national_count = sum(stray_dogs)) %>%
  ungroup() %>%
  mutate(
    is_national_max = national_count == max(national_count)
  ) %>%
  group_by(state, county) %>%
  mutate(
    is_county_max = stray_dogs == max(stray_dogs),
    days_from_national_max = abs(date - date[is_national_max] - 0.1)
  )  %>%
  arrange(state, county, desc(is_county_max), desc(days_from_national_max)) %>%
  mutate(your_result = as.integer(row_number() == 1)) %>%
  ungroup() %>%
  arrange(state, county, date)
2021-11-23 21:13:43

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................