R语言dplyr处理联合实验数据:实现受访者-实验-方案嵌套
R语言dplyr生态实现嵌套实验结构数据转换
实现思路
你需要的是典型的宽表转长表操作,使用dplyr配套的tidyr包pivot_longer()函数即可快速完成,无需手动逐列合并变量。
依赖包
首先加载所需工具包:
# 二选一即可,tidyverse包含dplyr和tidyr library(tidyverse) # 或者单独加载 library(dplyr) library(tidyr)
原始数据构建
你提供的示例原始数据可正确构建为:
# 原始数据集 ID <- c(1, 1, 1, 2, 2, 2) `Ex ID` <- c(1, 2, 3, 1, 2, 3) v1a <- c(2, 4, 5, 1, 3, 5) v2a <- c(3, 4, 5, 2, 1, 5) v3a <- c(5, 4, 3, 3, 2, 1) v1b <- c(4, 5, 5, 1, 5, 4) v2b <- c(5, 2, 2, 4, 1, 4) v3b <- c(5, 5, 4, 5, 4, 5) original <- data.frame(ID, `Ex ID`, v1a, v2a, v3a, v1b, v2b, v3b)
核心转换代码
desired <- original %>% pivot_longer( # 选择所有带a/b后缀的变量列,也可以用-c(ID, `Ex ID`)排除非变量列 cols = starts_with("v"), # 第一部分提取为变量名,第二部分提取为方案标识列 names_to = c(".value", "profile"), # 正则匹配拆分列名:前半部分是v加数字,后半部分是a/b names_pattern = "(v\\d+)([ab])" )
结果说明
转换后的数据自动满足要求:
- 新增
profile列标记方案a/b - 原v1a/v1b自动合并为
v1列,v2a/v2b合并为v2列,以此类推 - 保留原
ID和Ex ID的嵌套对应关系
如果你的变量命名规则不是v+数字,只需调整names_pattern的正则即可,比如所有后缀为a/b的变量,可把正则改为(.+)([ab])适配所有命名场景。
内容的提问来源于stack exchange,提问作者EHL
相关产品推荐
相关产品推荐

