如何用R语言将dat数据框转换为字符组合格式的result_1?
问题描述
我有如下R语言定义的dat数据框,需要将其转换为result_1的格式:
SNPA <- c('AA','AA','AT') SNPB <- c('CC','GG','CG') SNPC <- c('AG','AA','GG') dat <- data.frame(SNPA,SNPB,SNPC) result_1 <- data.frame(col1=c(rep('A',20),rep('T',4)), col2=c(rep('C',8),rep('G',8),rep('C',2),rep('G',2),rep('C',2),rep('G',2)), col3=c(c('A','G','A','G','A','G','A','G'),rep('A',8),rep('G',8)))
转换规则:将dat每行中各元素的每个字符与其他列元素的字符进行全组合,例如第一行可生成8种组合:ACA、ACG、ACA、ACG、ACA、ACG、ACA、ACG;第三行可生成8种组合:ACG、ACG、AGG、AGG、TCG、TCG、TGG、TGG,所有行的组合合并后即为result_1。
实现代码
方法一:基础R实现
# 初始化结果列表 result_list <- list() # 遍历dat的每一行 for (i in 1:nrow(dat)) { # 拆分当前行各列的SNP字符为单独向量 a_chars <- strsplit(dat$SNPA[i], "")[[1]] b_chars <- strsplit(dat$SNPB[i], "")[[1]] c_chars <- strsplit(dat$SNPC[i], "")[[1]] # 生成三列字符的所有笛卡尔积组合 row_comb <- expand.grid(col1 = a_chars, col2 = b_chars, col3 = c_chars, stringsAsFactors = FALSE) # 将当前行的组合加入结果列表 result_list[[i]] <- row_comb } # 合并所有行的组合数据框 result <- do.call(rbind, result_list) # 验证结果是否与result_1一致(返回TRUE则说明匹配) all.equal(result, result_1)
方法二:tidyverse实现(更简洁)
library(tidyverse) # 处理每行数据,生成所有组合 result <- dat %>% rowwise() %>% mutate( # 拆分每列的SNP字符为单独元素的列表 col1_list = list(str_split(SNPA, "")[[1]]), col2_list = list(str_split(SNPB, "")[[1]]), col3_list = list(str_split(SNPC, "")[[1]]), # 生成三列的笛卡尔积组合 comb = list(expand.grid(col1 = col1_list, col2 = col2_list, col3 = col3_list, stringsAsFactors = FALSE)) ) %>% # 展开组合数据框 unnest(comb) %>% # 选择并整理目标列 select(col1, col2, col3) %>% ungroup() # 验证结果匹配性 all.equal(result, result_1)
代码逻辑说明
- 字符拆分:通过
strsplit函数将每个SNP字符串(如"AA")拆分为单个字符的向量(c("A", "A"))。 - 笛卡尔积生成:使用
expand.grid生成三列拆分后字符的所有可能组合,这一步会自动计算每行的组合数(比如第一行2×2×2=8种,第二行2×2×2=8种,第三行2×2×2=8种,总共24行,与result_1的行数一致)。 - 结果合并:将每行生成的组合数据框合并为一个完整的数据框,最终结构与
result_1完全匹配。
内容的提问来源于stack exchange,提问作者pengxianglan
相关产品推荐
相关产品推荐

