假设我有一个类似的数据集:
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
来分配最佳选择(这有点低效,但应该足够快(。
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)