R宽格式数据转长格式:基于指定key设置分组变量层级的方法
R数据集长格式转换+自定义strata分组实现方案
1. 示例数据集构造
首先将你提供的数据集导入R环境:
df <- structure(list(group = c("A", "B", "A", "B", "B", "A", "A"), technique = c("attack", "defenese", "attack ", "defense ", "defense ", "attack", "defense "), outcome1.part1 = c(24L, 1234L, 15L, 234L, 23L, 3L, 3L), outcome1.part.2 = c(52L, 321L, 23L, 234L, 234L, 145L, 145L), outcome1.part.3 = c(14L, 23L, 3L, 2L, 234L, 234L, 234L), outcome2.part.1 = c(14L, 234L, 145L, 4L, 234L, 145L, 145L), outcome2.part.2 = c(234L, 234L, 234L, 234L, 234L, 234L, 234L), outcome2.part.3 = c(234L, 234L, 234L, 234L, 145L, 145L, 145L)), class = "data.frame", row.names = c(NA, -7L))
2. 核心实现逻辑
本方案完全不依赖正则表达式解析规则,仅需修改匹配key向量即可自动适配分组需求,调整灵活度高:
# 加载依赖包 library(dplyr) library(tidyr) # 1. 定义不需要转长格式的标识列 id_cols <- c("group", "technique") # 2. 自定义匹配key,可任意修改无需调整其他逻辑 # 注意key要和列名中的短语完全一致,示例中存在outcome1.part1列,因此第一个key设为part1 match_key <- c("part1", "part.2", "part.3") # 3. 转换逻辑 df_long <- lapply(match_key, function(k){ # 精确匹配包含当前key的列,fixed=TRUE表示不解析正则,仅做普通字符串匹配 target_cols <- c(id_cols, grep(k, colnames(df), fixed = TRUE, value = TRUE)) # 提取对应列转长格式并新增strata分组列 df_sub <- df[, target_cols] %>% pivot_longer(cols = -all_of(id_cols), names_to = "outcome_type", values_to = "value") %>% mutate(strata = k) return(df_sub) }) %>% bind_rows()
3. 效果说明
转换后的长格式数据会新增strata列,取值与你定义的match_key完全对应,每一行strata取值对应的都是原数据中列名包含该key短语的记录。
注意事项
- 自定义的
match_key需要和列名中包含的目标短语完全一致,匹配时不会做模糊处理 - 只要定义的key之间不存在互相包含的关系,匹配逻辑就不会出现冲突
内容的提问来源于stack exchange,提问作者rj44
相关产品推荐
相关产品推荐

