使用R将2行SNP数据转换为1行SNP数据

时间:2016-10-25 08:58:41

标签: r genetics

所以,我的问题出现了,因为我目前正在处理以下列格式收到的.csv文件的SNP数据:

alleleID | sample1 | sample2 | sample3
---------------------------------------
    A    |    1    |    0    |    0     
    A    |    0    |    1    |    1      
    B    |    0    |    0    |    1       
    B    |    1    |    1    |    0      
    C    |    1    |    0    |    1      
    C    |    1    |    1    |    1   

我需要合并具有相同alleleID的行(因此合并行2和3,合并4和5,合并6和7),维护alleleID,但根据以下条件更改其他单元格的值:
1和1 - > 2
0和1 - > 1
1和0 - > 0 *其中第一个值是顶行,第二个值是底行。

因此,最终结果应为:

alleleID | sample1 | sample2 | sample3
---------------------------------------
    A    |    0    |    1    |    1
    B    |    1    |    1    |    0
    C    |    2    |    1    |    2   

我如何用R?

获得这个

此致

洛伦佐

P.S。谢谢seb修理桌子

P.P.S。我已经尝试了R中的一些东西,但没有一个工作,我认为添加到目前为止尝试的东西只会让人感到困惑

2 个答案:

答案 0 :(得分:0)

以下是我建议的程序:

  1. 设置一个矩阵,其行和列名称分别为AlleleID和sample#。
  2. 矩阵的初始值为0
  3. 迭代上面的数据并使用AlleleID和sample#来索引矩阵,将观察到的数据值添加到矩阵值。
  4. 例如,对于AlleleID C和示例sample1,矩阵值的值1会增加两次,从而导致矩阵值为2

答案 1 :(得分:0)

你可以创建一个小函数来运行你的逻辑 - 这使用0和FALSE,1和TRUE

fx <- function(x){
  if(x[1] & x[2]) return(2)
  if(!x[1] & x[2]) return(1)
  if(x[1] & !x[2]) return(0)
  return(0)
}

然后使用dplyr迭代等位基因

library(dplyr)
df %>% group_by(alleleID) %>% summarise_all(fx)

如果您的数据集很大,可能有更快的方法来运行它 - 例如在运行之前将整个数据集转换为TRUE / FALSE。

您还应该检查每个等位基因是否只有两行

也许

stopifnot(all(table(df$alleleID) == 2))

数据

df <- read.table(text = "alleleID | sample1 | sample2 | sample3
    A    |    1    |    0    |    0     
    A    |    0    |    1    |    1      
    B    |    0    |    0    |    1       
    B    |    1    |    1    |    0      
    C    |    1    |    0    |    1      
    C    |    1    |    1    |    1 ", header = TRUE, sep = "|")