取 R 中最近的一行值?
Taking the more recent row of values in R?
如果我有以下数据框:
tibble(date = c("2010_quarter_1","2010_quarter_2", "2011_end"), values = c(100,100, 2000))
我如何应用过滤条件,以便当“quarter_1”和“quarter_2”都存在时,只取 quarter_2 的行,这样生成的数据框看起来像这样:
tibble(date = c("2010_quarter_2", "2011_end"), values = c(100, 2000))
有没有办法使用 filter() 对其进行编码 - 例如,如果它变为 2009_quarter_1 并且 2009_quarter_2 也存在,那么我们应该采用 2009_quarter_2.
但是当只有一个存在时,例如2009_quarter_1 那我们什么都不做
附加问题:
如果我们有以下数据框会发生什么:
tibble(date = c("2010_quarter_1","2010_half", "2011_end"), values = c(100,100, 2000))
对于这种情况 - 当 2010_quarter_1 和 2010_half 都发生时,我们只想获取 2010_half 的值,有没有办法做到这一点而无需硬编码,例如如果这种情况发生在 2011_quarter_1,然后是 2011_half,这与采用 2011_half?
是一样的
我认为诀窍是从日期字符串中获取实际日期,然后只保留最后一个可用日期(并保留年份数据)
dat <- tibble(date = c("2010_quarter_1","2010_quarter_2", "2011_end"), values = c(100,100, 2000))
dat %>%
mutate(quaterly_data = stringr::str_detect(date, "_quarter_")) %>%
mutate(updated_date = stringr::str_remove_all(date, "_quarter")) %>%
mutate(updated_date = stringr::str_replace(updated_date, "_end", "-12-31")) %>%
mutate(new_date = if_else(quaterly_data, lubridate::parse_date_time(updated_date, "%Y_%q"), lubridate::parse_date_time(updated_date, "%Y-%m-%d"))) %>%
mutate(year = lubridate::year(new_date)) %>%
group_by(year) %>%
filter(new_date == max(new_date) | !quaterly_data ) %>%
ungroup() %>%
select(date, values)
更新答案
此代码仅保留每年最后一次出现的顺序,顺序为 q1、q2、half、q3、q4、end
dat %>%
mutate(quaterly_data = stringr::str_detect(date, "_quarter_")) %>%
mutate(updated_date = stringr::str_remove_all(date, "_quarter")) %>%
mutate(updated_date = stringr::str_replace(updated_date, "_end", "-12-31")) %>%
mutate(updated_date = stringr::str_replace(updated_date, "_half", "-06-30")) %>%
mutate(new_date = if_else(quaterly_data,
lubridate::parse_date_time(updated_date, "%Y_%q"),
lubridate::parse_date_time(updated_date, "%Y-%m-%d"))) %>%
mutate(year = lubridate::year(new_date)) %>%
group_by(year) %>%
filter(new_date == max(new_date)) %>%
ungroup() %>%
select(date, values)
如果我有以下数据框:
tibble(date = c("2010_quarter_1","2010_quarter_2", "2011_end"), values = c(100,100, 2000))
我如何应用过滤条件,以便当“quarter_1”和“quarter_2”都存在时,只取 quarter_2 的行,这样生成的数据框看起来像这样:
tibble(date = c("2010_quarter_2", "2011_end"), values = c(100, 2000))
有没有办法使用 filter() 对其进行编码 - 例如,如果它变为 2009_quarter_1 并且 2009_quarter_2 也存在,那么我们应该采用 2009_quarter_2.
但是当只有一个存在时,例如2009_quarter_1 那我们什么都不做
附加问题:
如果我们有以下数据框会发生什么:
tibble(date = c("2010_quarter_1","2010_half", "2011_end"), values = c(100,100, 2000))
对于这种情况 - 当 2010_quarter_1 和 2010_half 都发生时,我们只想获取 2010_half 的值,有没有办法做到这一点而无需硬编码,例如如果这种情况发生在 2011_quarter_1,然后是 2011_half,这与采用 2011_half?
是一样的我认为诀窍是从日期字符串中获取实际日期,然后只保留最后一个可用日期(并保留年份数据)
dat <- tibble(date = c("2010_quarter_1","2010_quarter_2", "2011_end"), values = c(100,100, 2000))
dat %>%
mutate(quaterly_data = stringr::str_detect(date, "_quarter_")) %>%
mutate(updated_date = stringr::str_remove_all(date, "_quarter")) %>%
mutate(updated_date = stringr::str_replace(updated_date, "_end", "-12-31")) %>%
mutate(new_date = if_else(quaterly_data, lubridate::parse_date_time(updated_date, "%Y_%q"), lubridate::parse_date_time(updated_date, "%Y-%m-%d"))) %>%
mutate(year = lubridate::year(new_date)) %>%
group_by(year) %>%
filter(new_date == max(new_date) | !quaterly_data ) %>%
ungroup() %>%
select(date, values)
更新答案
此代码仅保留每年最后一次出现的顺序,顺序为 q1、q2、half、q3、q4、end
dat %>%
mutate(quaterly_data = stringr::str_detect(date, "_quarter_")) %>%
mutate(updated_date = stringr::str_remove_all(date, "_quarter")) %>%
mutate(updated_date = stringr::str_replace(updated_date, "_end", "-12-31")) %>%
mutate(updated_date = stringr::str_replace(updated_date, "_half", "-06-30")) %>%
mutate(new_date = if_else(quaterly_data,
lubridate::parse_date_time(updated_date, "%Y_%q"),
lubridate::parse_date_time(updated_date, "%Y-%m-%d"))) %>%
mutate(year = lubridate::year(new_date)) %>%
group_by(year) %>%
filter(new_date == max(new_date)) %>%
ungroup() %>%
select(date, values)