所以,我的问题出现了,因为我目前正在处理以下列格式收到的.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中的一些东西,但没有一个工作,我认为添加到目前为止尝试的东西只会让人感到困惑
答案 0 :(得分:0)
以下是我建议的程序:
0
。例如,对于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 = "|")