为特定于组的最大值出现创建虚拟对象,以总体最大值为条件

create dummy for group-specific maximum value occurence, conditional on overall maximum

假设我有一个与此类似的数据集:

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))

我想通过 group_by(state, county) 或任何类似的方法找到每个县发现流浪狗数量最多的日期,并创建一个二分变量(列),其值为 1 那天(其余几天需要 0)。但是,当某个时间段内没有流浪狗时,当most_stray_dogs等于1时,应该将这一天标记为1;当一个县内有多个流浪狗数量相同的日子时,它应该选择更接近 most_stray_dogs == 1.

的那一天

对于后一点,我的直觉是使用一个由 difftime 创建的辅助向量;尽管如此,我还是不能一次把所有这些都放在一起。我该如何创建这个专栏?

我认为这行得通。没有提供“正确答案”,而且数据大到让人难以目视,所以我不是很肯定,但它是有条不紊的,所以它至少应该让你走上正轨。

在计算数据差异时,我任意减去 0.1 作为全国最大前后相同天数之间的决胜局。然后我arrange每组分配​​top choice(效率有点低,但应该够快了)。

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)