如何基于月份分组为R dataframe创建虚拟变量
在R中按自定义月份分组创建虚拟变量
步骤1:还原示例数据集
先复现你提供的初始数据框:
df <- data.frame( Date = as.Date(c("2012-03-22", "2012-03-22", "2012-04-11", "2013-05-03", "2013-05-03", "2015-06-12", "2015-07-15")), Sales = c(22, 18, 20, 26, 15, 29, 22), Type = c("A", "B", "C", "A", "C", "A", "B") )
步骤2:提取日期中的月份
可以用基础R或lubridate包快速提取月份:
- 基础R实现:
df$Month <- as.integer(format(df$Date, "%m"))
lubridate包实现(更直观):
# 未安装包先执行:install.packages("lubridate") library(lubridate) df$Month <- month(df$Date)
步骤3:生成自定义虚拟变量
以下三种方法任选其一,满足不同场景需求:
方式一:用dplyr手动生成(代码直观,易调整规则)
# 未安装包先执行:install.packages("dplyr") library(dplyr) df_final <- df %>% mutate( Dummy1 = as.integer(Month == 3), # 3月对应Dummy1 Dummy2 = as.integer(Month == 5), # 5月对应Dummy2 Dummy3 = as.integer(Month %in% c(6,7)) # 6、7月对应Dummy3 ) %>% select(-Month) # 移除中间生成的Month列
方式二:用model.matrix生成(适配建模场景,自动处理因子)
# 定义分组标签 df$Group <- factor( case_when( df$Month == 3 ~ "Dummy1", df$Month == 5 ~ "Dummy2", df$Month %in% c(6,7) ~ "Dummy3", TRUE ~ NA_character_ ), levels = c("Dummy1", "Dummy2", "Dummy3") ) # 生成虚拟变量矩阵(-1表示不生成截距项) dummies <- model.matrix(~ Group - 1, data = df) # 合并并清理中间列 df_final <- cbind(df, dummies) %>% select(-Month, -Group)
方式三:用fastDummies包快速生成(代码最简洁)
# 未安装包先执行:install.packages("fastDummies") library(fastDummies) df$Group <- case_when( df$Month == 3 ~ "Dummy1", df$Month == 5 ~ "Dummy2", df$Month %in% c(6,7) ~ "Dummy3", TRUE ~ NULL ) # 生成虚拟变量并清理冗余列 df_final <- dummy_cols(df, select_columns = "Group", remove_selected_columns = TRUE) %>% select(-Month)
最终结果
执行上述任意方法后,df_final即为目标数据集,输出如下:
print(df_final) # Date Sales Type Dummy1 Dummy2 Dummy3 # 1 2012-03-22 22 A 1 0 0 # 2 2012-03-22 18 B 1 0 0 # 3 2012-04-11 20 C 0 0 0 # 4 2013-05-03 26 A 0 1 0 # 5 2013-05-03 15 C 0 1 0 # 6 2015-06-12 29 A 0 0 1 # 7 2015-07-15 22 B 0 0 1
内容的提问来源于stack exchange,提问作者Astral
相关产品推荐
相关产品推荐

