0

这是一个非常基本的问题......我敢肯定它写在这里的某个地方......我正在尝试创建一个新变量,告诉我三人组中是否存在孟德尔违反(遗传学数据)

例如(对于那些不了解遗传学的人):对于一个家庭(每行一个),我将父亲、母亲和孩子的基因型表示为 A/G、G/A、G/G(作为单独的变量)。我想创建一个新的 0/1 或 False/True 变量,告诉我 Child 的等位基因 1 是否在母亲基因型的等位基因或父亲基因型的任一等位基因中可见。等位基因 2 也是如此。

我尝试在 R 中按如下方式使用正则表达式:

vcf_GT$MVLR <- regexpr(c(sapply(strsplit(as.character(vcf_GT[,10]),"/"),function(x) x[1])), 
(sapply(strsplit(as.character(vcf_GT[,10]),"/"),function(x) x[2])), 
(c(c(sapply(strsplit(as.character(vcf_GT[,9]),"/"),function(x) x[1])), 
(sapply(strsplit(as.character(vcf_GT[,9]),"/"),function(x) x[2])),
c(sapply(strsplit(as.character(vcf_GT[,8]),"/"),function(x) x[1])), 
(sapply(strsplit(as.character(vcf_GT[,8]),"/"),function(x) x[2]))))) > 0

第 10 列代表孩子的基因型,第 9 列和第 8 列分别代表母亲和父亲的基因型。这很乏味,我可能在这里的某个地方忘记了括号。

必须有一种更简单的方法来与父母检查孩子的基因型。

提前致谢!

PS如果我没有意义 - 我会尝试添加更多细节。

编辑:虽然我的代码实际上是一大行,但我已根据要求添加了返回值,因此更易于阅读(尽管如此,无论如何都很难:))

4

2 回答 2

1

首先,如果您发现自己一遍又一遍地做同样的事情,请编写一个函数。所以而不是

c(sapply(strsplit(as.character(vcf_GT[,10]),"/"),function(x) x[1]))... 

写一个小包装:

myfun <- function(var1, var2, dat=vcf_GT) {
    sapply(strsplit(as.character(dat[,var1], '/'),
           function(x) x[var2])
}

现在你粘贴在上面的东西变成了这样:

regexpr(c(myfun(10, 1),
          myfun(10, 2)...

但是,我认为有一个更简单的方法......

为了解决这样的(或任何类型的)问题,我通常把它分成几块。从您给出的单个“行”开始并编写一些执行您想要的功能(对不起,如果我弄错了,但那是令人困惑的代码!)...

dad = 'A/G'
mom = 'G/A'
kid = 'G/G'

splt <- function(x) unlist(strsplit(x, '/'))
comp <- function(x, y) c(x[1] %in% y, x[2] %in% y)

comp(splt(kid), splt(dad))

从那里你apply远离在data.frame上这样做:

## make some data
possible <- expand.grid(c('C', 'T', 'A', 'G'),
                        c('C', 'T', 'A', 'G'))

gen <- function(n, pos=possible) {
    res=possible[sample(1:nrow(possible), n, replace=TRUE),]
    return (paste(res[,1], res[,2], sep='/'))
}

n <- 10
dat <- data.frame(mom=gen(n), dad=gen(n), kid=gen(n))

# put both functions together
splt_and_comp <- function(x, y) {
    x <- splt(x)
    y <- splt(y)

    comp(x, y)
}

# you could do this with `apply` as well...
mapply(splt_and_comp, dat$kid, dat$mom)

FWIW,您当前的代码regexpr使用以下三个参数调用。它可以很好地运行,但无法阅读,并且到处都有额外的括号:

first_arg <- c(sapply(strsplit(as.character(vcf_GT[,10]), "/"),
                      function(x) x[1]))

second_arg <- (sapply(strsplit(as.character(vcf_GT[, 10]), "/"),
                      function(x) x[2]))

third_arg <- (c(c(sapply(strsplit(as.character(vcf_GT[,9]),"/"),
                           function(x) x[1])), 
                  (sapply(strsplit(as.character(vcf_GT[,9]),"/"),
                          function(x) x[2])),
                  c(sapply(strsplit(as.character(vcf_GT[,8]),"/"),
                           function(x) x[1])), 
                  (sapply(strsplit(as.character(vcf_GT[,8]),"/"),
                          function(x) x[2]))))
于 2013-09-10T22:04:42.297 回答
0

如果您只想查看与母亲或父亲匹配的等位基因,则不一定需要正则表达式才能做到这一点。您可以使用运算符来执行此%in%操作(这也称为match()函数,但我更喜欢这种语法。

让我们建立我们的基因型数据框。请注意,最后一个“家庭”是孩子与母亲有不同等位基因的家庭。

x <- data.frame(list(mom = c("A/G", "C/C", "C/A"), 
                     dad = c("G/A", "T/T", "A/A"), 
                     child = c("G/G", "T/T", "A/T")
                    ), stringsAsFactors = FALSE)

现在,我们可以设置我们的函数来检查孩子的等位基因。您必须将其更改c(1,2,3)c(8,9,10)才能在您的数据集上工作,但它应该可以工作。这是我们将在数据框的每一行上使用的函数。它将拆分家庭的所有基因型,将孩子与母亲和父亲进行比较,然后确定孩子的基因型是否与父母中的任何一方匹配。

check_child_allele <- function(x) {
    fam <- strsplit(as.character(x[c(1, 2, 3)]), "/")
    names(fam) <- c("mom", "dad", "child")
    mom_query <- fam[["child"]] %in% fam[["mom"]]
    dad_query <- fam[["child"]] %in% fam[["dad"]]
    fam_matrix <- matrix(c(mom = mom_query, dad = dad_query), nrow = 2)
    child_match_parents <- rowSums(fam_matrix)
    child_geno <- ifelse(child_match_parents < 1, FALSE, TRUE)
    return(child_geno)
}

检查示例。

apply(x, 1, check_child_allele)

##      [,1] [,2]  [,3]
## [1,] TRUE TRUE  TRUE
## [2,] TRUE TRUE FALSE

更改数据框以表示与父母都不匹配的孩子。

y <- x
y[2, 3] <- "A/G"  # Adding a child that has no alleles in common with parents
apply(y, 1, check_child_allele)

##      [,1]  [,2]  [,3]
## [1,] TRUE FALSE  TRUE
## [2,] TRUE FALSE FALSE

可能与您的工作无关的旁注:

您可能担心的一件事是,这将检查等位基因是否存在于父母中,但不会检查父母双方是否确实是可能的父母。第一个数据框中的第二组基因型是一个例子,因为孩子是“T/T”,但母亲是“C/C”。

希望有帮助!

于 2013-09-11T05:47:49.740 回答