统计基因座内顺序无关的基因型字符串出现次数
统计基因座内顺序无关的基因型字符串出现次数
看起来你已经用R构建出了双同源染色体的 Punnett 方格,现在需要统计那些基因座内等位基因顺序不影响的基因型的出现频率(比如Aa和aA算同一种,但AA和aa是不同的),这个需求很常见,咱们可以通过标准化基因型字符串的方式来实现,步骤很清晰:
步骤1:提取所有基因型并标准化
首先我们需要把数据框里的所有基因型提取成一维向量,然后写一个小函数,把每个基因型的每个基因座内的等位基因按字母排序,这样就能把顺序不同但实质相同的基因型统一成同一个标准格式。
比如AabB会被转换成AaBb,aAbB也会变成AaBb,这样后续统计就不会重复计数了。
完整代码如下:
# 先复用你已经生成的offspring数据框 col_names<-c("AB", "Ab", "aB", "ab") row_names<-c("AB", "Ab", "aB", "ab") offspring<-as.data.frame(matrix(ncol=length(col_names), nrow=length(row_names), dimnames=list(row_names, col_names))) for(i in 1:length(row_names)){ for(j in 1: length(col_names)){ offspring[i,j]<-paste0(substr(rownames(offspring)[i],1,1), substr(colnames(offspring)[j],1,1), paste0(substr(rownames(offspring)[i],2,2), substr(colnames(offspring)[j],2,2))) } } # 提取所有基因型到一维向量 all_genotypes <- as.vector(offspring) # 定义标准化函数:对每个基因座内的字符排序 standardize_genotype <- function(x) { # 处理第一个基因座(前2个字符) locus1 <- strsplit(substr(x, 1, 2), "")[[1]] locus1_sorted <- paste(sort(locus1), collapse = "") # 处理第二个基因座(后2个字符) locus2 <- strsplit(substr(x, 3, 4), "")[[1]] locus2_sorted <- paste(sort(locus2), collapse = "") # 合并成标准化后的基因型 paste0(locus1_sorted, locus2_sorted) } # 对所有基因型应用标准化 standardized_genotypes <- sapply(all_genotypes, standardize_genotype) # 统计频率 frequency_table <- table(standardized_genotypes) # 转换成易读的数据框格式(可选) frequency_df <- as.data.frame(frequency_table) colnames(frequency_df) <- c("基因型", "出现次数") print(frequency_df, row.names = FALSE)
运行结果
执行后会得到和你期望完全一致的统计结果:
基因型 出现次数 AABB 1 AABb 2 AAbb 1 AaBB 2 AaBb 4 Aabb 2 aaBB 1 aaBb 2 aabb 1
这个方法的好处是扩展性强,如果以后要处理更多基因座的情况,只需要修改函数里的基因座拆分逻辑就可以啦。
备注:内容来源于stack exchange,提问作者Phenomniverse
相关产品推荐
相关产品推荐

