在R中如何根据变量名前缀添加分组列Group_Var
问题描述
现有如下mydf数据框(宽格式):
library(dplyr) glimpse(mydf) Rows: 3,286 Columns: 741 $ acc_180d_gdd_diff_GO_biz <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,… $ acc_180d_gdd_diff_MG_biz <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,… $ acc_180d_gdd_diff_MS_biz <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,… $ acc_180d_gdd_diff_MT_biz <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,… $ acc_180d_gdd_diff_PR_biz <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,… $ acc_180d_gdd_diff_RS_biz <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,… $ acc_180d_gdd_diff_US_IA_biz <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,… $ acc_180d_gdd_diff_US_IL_biz <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,… $ gdd_90d_precip_GO_biz <dbl> 22.53283, 29.86229, 31.01503, 38… $ gdd_90d_precip_MG_biz <dbl> 10.96422, 11.70888, 14.23489, 19… $ gdd_90d_precip_MS_biz <dbl> 6.976152, 27.515620, 27.758262, … $ gdd_90d_precip_MT_biz <dbl> 26.55052, 26.55052, 64.79208, 67… ...
需要新增一列Group_Var,根据变量名对数据归类(比如变量名以"acc"开头的标记为"climatic"),如何用mutate函数实现?
解决方案
你的数据是宽格式(变量名作为列名),直接用mutate无法基于列名给每行标记分组,得先转成长格式让变量名成为单独列,再进行分组标记:
- 加载所需工具包:
library(dplyr) library(tidyr) library(stringr)
- 转长格式并新增分组列:
mydf_long <- mydf %>% pivot_longer(cols = everything(), names_to = "var_name", values_to = "value") %>% mutate(Group_Var = case_when( str_starts(var_name, "acc") ~ "climatic", str_starts(var_name, "gdd") ~ "climatic", str_starts(var_name, "price") ~ "price", TRUE ~ "other" ))
关键说明:
pivot_longer将宽格式转成长格式,把原列名存入var_name列,原单元格值存入value列,这样才能对变量名做匹配判断。str_starts用于快速判断字符串是否以指定前缀开头,语法比基础R的grepl更简洁。case_when支持批量设置多组匹配规则,可根据需求扩展更多分组条件。
如果后续需要转回宽格式,可使用:
mydf_wide <- mydf_long %>% pivot_wider(names_from = var_name, values_from = value)
内容的提问来源于stack exchange,提问作者Rodrigo H. Ozon
相关产品推荐
相关产品推荐

