2013-09-24 14 views
0

從以前的問題,我有大約嘗試檢查父是否是給孩子的基因型正確的父詞幹(見Checking whether a "string" expression in a specified variable is contained in several other variables如何找到與隱性純合值

現在,我想看看是否如果小孩的基因型是隱性基因型(對這個基因有兩個相同的隱性值[等位基因])。在這種情況下,孩子總是受這種疾病的影響,而父母則不患病(孩子是先證者)。我試圖弄清楚父母和孩子是否是純合子,並且確定孩子是否與父母的基因型相匹配......但是從這兩條信息我似乎無法確定孩子是否是隱性純合子...

這裏是我迄今爲止(按照similar answer從上面):

homo <- read.table("/.../Family1a/Family1a_vcf.txt", sep="\t", header=T) 

d <- data.frame(list(mom = homo[c(1)], 
       dad = homo[c(2)], 
       child = homo[c(3)] 
       ), stringsAsFactors = FALSE) 


check_homo <- function(x) { 
    #homo 
    m1 <- sapply(strsplit(as.character(d[,2]),"/"),function(x) x[1]) 
    m2 <- sapply(strsplit(as.character(d[,2]),"/"),function(x) x[2]) 
    d1 <- sapply(strsplit(as.character(d[,1]),"/"),function(x) x[1]) 
    d2 <- sapply(strsplit(as.character(d[,1]),"/"),function(x) x[2]) 
    c1 <- sapply(strsplit(as.character(d[,3]),"/"),function(x) x[1]) 
    c2 <- sapply(strsplit(as.character(d[,3]),"/"),function(x) x[2]) 

    mom_homo <- m1 == m2 
    dad_homo <- d1 == d2 
    child_homo <- c1 == c2 

    homo_matrix_d <- matrix(c(dad_homo,child_homo), ncol=2, byrow=TRUE) 
    homo_matrix_m <- matrix(c(mom_homo,child_homo), ncol=2, byrow=TRUE) 

    homo_match_dc <- rowSums(homo_matrix_d) 
    homo_match_mc <- rowSums(homo_matrix_m) 

    #which ones equal parents 
    fam <- strsplit(as.character(d[c(1, 2, 3)]), "/") 
    names(fam) <- c("mom", "dad", "child") 
    mom_query <- fam[["child"]] == fam[["mom"]] 
    dad_query <- fam[["child"]] == fam[["dad"]] 
    fam_matrix <- matrix(c(mom=mom_query, dad=dad_query), nrow=2)   
    child_match_parents <- rowSums(fam_matrix) 

#if child doesn't match parents and child_homo = recessive 
#if child does equal parents,if homo_parent and homo_child then child = dominant 

    child_rec <- ifelse((child_match_parents < 1 & child_homo == "TRUE"), "RECESSIVE", "OTHER") 
    child_dom <- ifelse((child_match_parents != 0 & child_homo == "TRUE") & (mom_homo == "TRUE" | dad_homo == "TRUE"), "DOMINANT", "OTHER") 

} 

child_recessive_tmp <- data.frame(apply(x, 1, check_homo)) 

它是不能工作循環中的最後兩行。這整個事情可能是錯的,所以我不介意沮喪的迴應。總之,我想要一個變量來說明孩子的基因型是否是純合隱性的。

編輯:

數據示例:每行有一個SNP。

Mom Dad Child 
rs1 A/A G/G A/G 
rs2 T/C T/C T/T 
rs3 A/A C/A A/A 
. 
. 
. 
rs100 G/C A/G C/A 
+0

您可以添加一些示例數據嗎? – dayne

+0

這不會解決你的問題,但你不需要引用'TRUE'和'FALSE'。事實上,根本不需要'== TRUE','&child_homo'等同於'&child_homo == TRUE'(只要'child_homo'是一個布爾值)。 – Gregor

回答

1

與您的代碼的問題:你的函數沒有返回值,所以不管它是否你想要做什麼,你不會有任何輸出(我會建議你使用if()else if()else如下)。

另外:雖然你的功能是一個數據框,但該功能似乎並不使用任何輸入。前幾行在原始數據幀上運行 - 而不是輸入。

和我會強烈推薦,您將瞭解如何使用debug來逐步完成故障功能。

這裏是實現你的功能更簡潔的方式:

sample_dat <- data.frame(mom = c("A/A", "T/C", "A/A", "G/C"), dad = c("G/G", "T/C", "C/A", "A/G"), child = c("A/G", "T/T", "A/A", "C/A")) 

check_homo <- function(d) { 
    fam <- sapply(d, function(.) strsplit(as.character(.), "/")) 
    homozygous <- unlist(lapply(fam, function(x) identical(x[[1]], x[[2]]))) 
    if (homozygous[3] & !duplicated(fam)[3]) "RECESSIVE" 
    else if (sum(homozygous[1:2]) >= 1 & homozygous[3] & duplicated(fam)[3]) "DOMINANT" 
    else "OTHER" 
    } 

apply(sample_dat, 1, check_homo) 

# [1] "OTHER"  "RECESSIVE" "DOMINANT" "OTHER" 

您可以使用debug來逐步check_homo,瞭解每一行的目的。