这是一个非常基本的问题..。我肯定写在这里的某个地方..。我正在尝试创建一个新的变量来告诉我是否在三人组(遗传学数据)中存在着违反菜单的行为。
例如(对于那些不懂遗传学的人):对于一个家庭(每排一个),我的父亲、母亲和孩子的基因型表示为A/G,G/A,G/G (作为单独的变量)。我想要创建一个新的0/1或False/True变量来告诉我,孩子的等位基因1是在母亲基因型的等位基因中还是在父亲基因型的等位基因中。等位基因2也是如此。
在R中,我尝试使用regexpr,如下所示:
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栏分别代表母亲和父亲。这很乏味,我可能忘了这里某个地方的括号。
必须有一个更容易的方法来检查孩子的基因型与父母。
提前感谢!
如果我说不通的话-我会尽量增加一些细节。
编辑:虽然我的代码实际上是一个很大的行,但按照请求,我增加了返回,因此更容易阅读(尽管,它很难忽略:)
发布于 2013-09-11 05:47:49
如果您只想简单地查看与母亲或父亲匹配的等位基因,则不一定需要regexp才能做到这一点。您可以使用%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-10 22:04:42
首先,如果你发现自己一遍又一遍地做着同样的事情,那就写一个函数。所以而不是
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]))))
https://stackoverflow.com/questions/18729152
复制相似问题