为特定于组的最大值出现创建虚拟对象,以总体最大值为条件
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)
假设我有一个与此类似的数据集:
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)