首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查指定变量中的“字符串”表达式是否包含在其他几个变量中。

检查指定变量中的“字符串”表达式是否包含在其他几个变量中。
EN

Stack Overflow用户
提问于 2013-09-10 21:38:09
回答 2查看 520关注 0票数 0

这是一个非常基本的问题..。我肯定写在这里的某个地方..。我正在尝试创建一个新的变量来告诉我是否在三人组(遗传学数据)中存在着违反菜单的行为。

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

在R中,我尝试使用regexpr,如下所示:

代码语言:javascript
运行
复制
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栏分别代表母亲和父亲。这很乏味,我可能忘了这里某个地方的括号。

必须有一个更容易的方法来检查孩子的基因型与父母。

提前感谢!

如果我说不通的话-我会尽量增加一些细节。

编辑:虽然我的代码实际上是一个很大的行,但按照请求,我增加了返回,因此更容易阅读(尽管,它很难忽略:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-11 05:47:49

如果您只想简单地查看与母亲或父亲匹配的等位基因,则不一定需要regexp才能做到这一点。您可以使用%in%运算符(这也称为match()函数)来实现这一点,但我更喜欢这种语法。

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

代码语言:javascript
运行
复制
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),这样它才能在您的数据集上工作,但是它应该可以工作。这是我们将在数据帧的每一行上使用的函数。它将分裂家庭的所有基因型,将孩子与母亲和父亲进行比较,然后确定孩子的基因型是否与父母任何一方相匹配。

代码语言:javascript
运行
复制
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)
}

检查这个例子。

代码语言:javascript
运行
复制
apply(x, 1, check_child_allele)

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

更改数据框架,以表示与父母任何一方都不匹配的子程序。

代码语言:javascript
运行
复制
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“。

希望这能帮上忙!

票数 0
EN

Stack Overflow用户

发布于 2013-09-10 22:04:42

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

代码语言:javascript
运行
复制
c(sapply(strsplit(as.character(vcf_GT[,10]),"/"),function(x) x[1]))... 

编写一个小包装:

代码语言:javascript
运行
复制
myfun <- function(var1, var2, dat=vcf_GT) {
    sapply(strsplit(as.character(dat[,var1], '/'),
           function(x) x[var2])
}

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

代码语言:javascript
运行
复制
regexpr(c(myfun(10, 1),
          myfun(10, 2)...

不过,我觉得还有更简单的方法..。

为了解决这样的问题(或任何类型的问题),我通常把它分成几块。从你给出的“行”开始,编写一些你想做的函数(如果我弄错了,很抱歉,但是代码很混乱!)

代码语言:javascript
运行
复制
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上执行此操作:

代码语言:javascript
运行
复制
## 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。它可以很好地发挥作用,但不可能读懂,而且到处都有额外的括号:

代码语言:javascript
运行
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18729152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档