在R语言中如何提取同Series下的不同日期并统一替换为该序列首个日期
实现方案
不需要自己编写loop函数,R内置的分组函数即可高效完成需求,执行效率比自定义循环更高,以下提供两种常用实现方式:
基础R实现
方案1:按数据出现顺序取Series首个日期
# 按Series分组,将每组TIME统一为该组第一个出现的TIME值 df$TIME <- ave(df$TIME, df$Series, FUN = function(x) x[1]) # 按TIME和block分组计算RE均值,返回格式和你原需求的tapply一致 mean_res <- tapply(df$RE, list(df$TIME, df$block), mean)
方案2:按日期先后取Series最早日期
如果需要的是该Series所有日期里时间最早的,而非数据中第一个出现的,用以下代码先做日期转换再取值:
# 转换为日期格式避免字符串排序错误 df$DATE <- as.Date(df$TIME, format = "%d/%m/%Y") # 按Series分组取最小日期,再转回原字符串格式 df$TIME <- ave(df$DATE, df$Series, FUN = function(x) format(min(x), "%d/%m/%Y")) # 后续计算均值逻辑不变 mean_res <- tapply(df$RE, list(df$TIME, df$block), mean)
tidyverse实现(代码可读性更高)
library(dplyr) library(tidyr) mean_res <- df %>% # 按Series分组替换TIME,取第一个出现的日期 group_by(Series) %>% mutate(TIME = first(TIME)) %>% # 若要取最早日期,替换上面的mutate为以下代码: # mutate(TIME = format(min(as.Date(TIME, "%d/%m/%Y")), "%d/%m/%Y")) %>% # 按TIME和block分组求均值 group_by(TIME, block) %>% summarise(mean_RE = mean(RE), .groups = "drop") %>% # 可选:转换为tapply输出的矩阵格式 pivot_wider(names_from = block, values_from = mean_RE)
内容的提问来源于stack exchange,提问作者LEE
相关产品推荐
相关产品推荐

