这是一个非常基本的问题......我确定它写在这里...我正在尝试创建一个新变量,告诉我三重奏中是否存在mendialian违规(遗传数据)< / p>
例如(对于那些不了解遗传的人): 对于一个家庭(每行一个),我将父亲,母亲和孩子的基因型表示为A / G,G / A,G / G(作为单独的变量)。我想创建一个新的0/1或False / True变量,告诉我是否在母亲基因型的等位基因或父亲基因型的任一等位基因中都可以看到儿童的等位基因1。 Allele 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列代表Child的基因型,9和8分别代表母亲和父亲。这很乏味,我可能忘记了这里的某个括号。
必须有一种更简单的方法来检查孩子与父母的基因型。
提前致谢!
P.S。如果我没有意义 - 我会尝试添加更多细节。
编辑:虽然我的代码实际上是一个巨大的行,但是根据要求,我已经添加了返回,因此它更容易阅读(尽管如此,它有点难以理解:))
答案 0 :(得分: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]))))
答案 1 :(得分: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”。
希望有所帮助!