如何基于日期范围高效将tsibble中的values替换为NA(不修改时间类型)
高效批量将tsibble指定时间段的values设为NA
我用以下代码创建了tsibble对象:
library(tidyverse) library(tsibble) time <- c("2020 01", "2020 02", "2020 03", "2020 04", "2020 05", "2020 06", "2020 01", "2020 02", "2020 03", "2020 04", "2020 05", "2020 06", "2020 01", "2020 02", "2020 03", "2020 04", "2020 05", "2020 06", "2020 01", "2020 02", "2020 03", "2020 04", "2020 05", "2020 06") state <- c(rep("CA", 6), rep("PA", 6), rep("NY", 6), rep("WI", 6)) values <- rnorm(24) dataf <- data.frame(time, state, values) dataf <- dataf %>% mutate(time = yearmonth(time)) %>% as.data.frame() dataf_tsible <- as_tsibble(dataf, index = time, key = state)
目前我通过逐个月份赋值的方式,把2020年3-5月的values设为NA:
dataf_tsible$values[dataf_tsible$time== yearmonth("2020 Mar")] <- NA dataf_tsible$values[dataf_tsible$time== yearmonth("2020 Apr")] <- NA dataf_tsible$values[dataf_tsible$time== yearmonth("2020 May")] <- NA
想找更高效的实现方式,且不修改time列的yearmonth类型。
方法1:用dplyr::mutate + case_when批量匹配
用case_when一次性定义时间段规则,代码更简洁易读:
dataf_tsible <- dataf_tsible %>% mutate(values = case_when( time >= yearmonth("2020 Mar") & time <= yearmonth("2020 May") ~ NA_real_, .default = values ))
方法2:用between函数简化逻辑判断
yearmonth类型支持between函数,能更紧凑地写出时间段条件:
dataf_tsible <- dataf_tsible %>% mutate(values = if_else(between(time, yearmonth("2020 Mar"), yearmonth("2020 May")), NA_real_, values))
方法3:向量化索引赋值
保留原始赋值思路,但用向量一次性匹配所有目标月份,避免重复代码:
target_months <- yearmonth(c("2020 Mar", "2020 Apr", "2020 May")) dataf_tsible$values[dataf_tsible$time %in% target_months] <- NA
以上三种方法都不会修改time列的yearmonth类型,且都是批量操作,比逐个赋值更高效,尤其是当目标时间段更长时优势更明显。
内容的提问来源于stack exchange,提问作者JontroPothon
相关产品推荐
相关产品推荐

