如何按年份拆分DataFrame并指定类别保持分组不拆分?
按年份拆分DataFrame并保留House B记录完整
问题背景
现有如下R语言生成的模拟DataFrame:
House = rep(c('A','B','C'), each=10) Date = as.Date(c('2014-10-13','2014-10-20','2014-10-27','2014-11-03','2014-11-10','2014-10-30','2014-11-06','2014-11-13','2014-11-20','2014-11-27', '2019-11-27','2019-12-04','2019-12-11','2019-12-18','2019-12-25','2020-01-01','2020-01-08','2020-01-15','2020-01-22','2020-01-29', '2017-07-13','2017-07-20','2017-04-21','2017-04-28','2017-05-05','2017-05-12','2017-05-19','2017-05-26','2017-06-02','2017-06-09')) Week = rep(c(1,2,3,4,5,6,7,8,9,10), times=3) Value = c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1,0.01,0.02,0.03,0.04,0.05,0.06,0.07,0.08,0.09,0.1,0.001,0.002,0.003,0.004,0.005,0.006,0.007,0.008,0.009,0.01) mock = data.frame(House,Date,Week,Value)
需要按年份拆分该DataFrame,但必须将House为B的所有记录保留在同一个子DataFrame中,不能将其拆分为2019和2020两个独立部分。此前使用split()和dplyr::group_split()均未得到预期结果,期望得到包含合并后House B记录的子DataFrame列表。
解决方案
核心思路是自定义分组键:为House B的所有行设置统一的分组标识,其余行按年份分组,再基于该分组键完成拆分。
方法一:Base R实现
# 添加自定义分组键 mock$group_key = ifelse(mock$House == "B", "2019-2020", format(mock$Date, "%Y")) # 按分组键拆分DataFrame split_mock = split(mock, mock$group_key) # 查看House B的合并结果 split_mock[["2019-2020"]]
方法二:dplyr实现
library(dplyr) split_mock_dplyr = mock %>% # 生成自定义分组键 mutate(group_key = ifelse(House == "B", "2019-2020", format(Date, "%Y"))) %>% # 按分组键拆分,不保留分组键列 group_split(group_key, .keep = FALSE) %>% # 为列表元素设置名称 setNames(unique(mock$group_key)) # 查看House B的合并结果 split_mock_dplyr[["2019-2020"]]
预期结果
拆分后的列表中,House B的10条记录将全部集中在名为2019-2020的子DataFrame中,示例输出如下:
$`2019-2020` House Date Week Value 11 B 2019-11-27 1 0.01 12 B 2019-12-04 2 0.02 13 B 2019-12-11 3 0.03 14 B 2019-12-18 4 0.04 15 B 2019-12-25 5 0.05 16 B 2020-01-01 6 0.06 17 B 2020-01-08 7 0.07 18 B 2020-01-15 8 0.08 19 B 2020-01-22 9 0.09 20 B 2020-01-29 10 0.10
内容的提问来源于stack exchange,提问作者Gerlex
相关产品推荐
相关产品推荐

