R语言中双胞胎数据集DataFrame重塑的实现方法咨询
实现方案
1. tidyverse 方案(可读性高,易调整)
首先加载依赖包,测试数据和你给出的结构一致,你可以直接替换成自己的原始数据框:
# 加载依赖 library(dplyr) library(tidyr) # 你的原始数据框,替换为自己的即可 twins_raw <- data.frame( ID = c(2891, 2892, 4000, 4001, 4006, 4007), zyg.x = c(2,2,1,1,2,2), CDsum = c(0,5,0,0,0,3) )
处理代码:
twins_result <- twins_raw %>% # 每2行划为一对,生成配对序号 mutate(pair_idx = rep(1:(n()/2), each = 2), # 标记同对双胞胎的序号 twin_tag = paste0("CDsumTwin", 1:2)) %>% # 长表转宽表,拆分CDsum为两个双胞胎的单独列 pivot_wider( id_cols = c(pair_idx, zyg.x), names_from = twin_tag, values_from = CDsum, values_fn = list(CDsum = identity, ID = list) ) %>% # 构造要求格式的配对名称列 mutate(`Twin Pair` = paste0("pair", pair_idx, "(", ID[[1]], ",", ID[[2]], ")")) %>% # 调整列顺序、重命名列匹配目标格式 select(`Twin Pair`, zyg = zyg.x, CDsumTwin1, CDsumTwin2)
2. 基础R方案(无需安装额外包)
n_row <- nrow(twins_raw) pair_count <- n_row %/% 2 # 分别提取每对的1号、2号样本 twin1 <- twins_raw[seq(1, n_row, 2), ] twin2 <- twins_raw[seq(2, n_row, 2), ] # 合并构造结果 twins_result <- data.frame( `Twin Pair` = paste0("pair", 1:pair_count, "(", twin1$ID, ",", twin2$ID, ")"), zyg = twin1$zyg.x, CDsumTwin1 = twin1$CDsum, CDsumTwin2 = twin2$CDsum, check.names = FALSE # 保留列名中的空格 )
注意事项
如果你的原始数据存在不成对的多余行,运行前先执行以下代码截除异常行:
twins_raw <- twins_raw[1:(floor(nrow(twins_raw)/2)*2), ]
内容的提问来源于stack exchange,提问作者wooden05
相关产品推荐
相关产品推荐

