【问题标题】:Basic Variable Lookup in RR中的基本变量查找
【发布时间】:2015-12-06 04:07:58
【问题描述】:

我有两个文件。一个有一系列我感兴趣的基因。另一个有基因及其相关的途径。所以第一个列表看起来像这样:

Solyc08g062250
Solyc02g069270
Solyc07g064990
Solyc09g065800
Solyc02g077620
Solyc01g104400
Solyc02g065290
Solyc02g090220

还有一个包含这些基因的列表以及它们所属的“路径”(这是文件的样本,文件要大得多,并且有多个路径和基因):

Solyc10g008120  1,3,5-trimethoxybenzene biosynthesis
Solyc02g069920  1,4-dihydroxy-2-naphthoate biosynthesis I
Solyc04g005180  1,4-dihydroxy-2-naphthoate biosynthesis I
Solyc04g005190  1,4-dihydroxy-2-naphthoate biosynthesis I
Solyc04g005200  1,4-dihydroxy-2-naphthoate biosynthesis I
Solyc05g005180  1,4-dihydroxy-2-naphthoate biosynthesis I
Solyc06g071030  1,4-dihydroxy-2-naphthoate biosynthesis I

问题是我的几个基因落入了几个途径。我需要一种很好的方法来获取每个基因,并在我从一组输入的每个基因 ID 旁边列出它负责的所有途径。

我最初是尝试使用命令

c<-b[b$GeneID %in% a$GeneIDs,]

其中 b 是我的通路/GeneID,a 是我想要的基因 ID 列表,但它只返回一个通路,我知道其中许多基因属于多个通路。

我完全是编程新手,所以我遇到了麻烦。任何帮助,将不胜感激!我不知道如何在互联网上搜索,因为我不知道这叫什么。

【问题讨论】:

  • 你可以使用lapply查看第一个的GeneID,然后使用%in%。即lapply(a$GeneIDs, function(x) b[b$GeneID ==x,]) 输出将是data.frames 的列表(假设这是你想要的)
  • 这个问题与这个问题非常相似:stackoverflow.com/questions/30331830/… 你可能想尝试一下接受的答案
  • 请记住,c 本身就是 R 中的一个函数,将变量分配给 c 可能会导致奇怪的行为
  • 任何答案对您有用吗?如果是这样,请考虑通过单击问题投票下方的勾号将其标记为“已接受”
  • 给我一些时间 PavoDive,我刚刚醒来。当我阅读列表并理解命令时,我会尝试给出答案。我是新手,所以我需要查看命令及其工作原理。

标签: r


【解决方案1】:

使用一些玩具数据,这样的事情会有所帮助吗:

allgenes <- c("a", "b", "c")
dat <- data.frame(gene = c(rep("a", 2), "b", rep("c", 2)), 
   path = paste("path", 1:5))
dat
 gene   path
1    a path 1
2    a path 2
3    b path 3
4    c path 4
5    c path 5

创建一个用逗号分隔每个路径的数据框

res <- lapply(allgenes, function(y) paste(dat$path[which(dat$gene %in% y)], collapse=", "))
data.frame(allgenes, paths=do.call(rbind, res))

  allgenes          paths
1        a path 1, path 2
2        b         path 3
3        c path 4, path 5

【讨论】:

    【解决方案2】:

    我在想你想做这样的事情。

    library(dplyr)
    library(magrittr)
    
    gene.interested =
      data_frame(gene = c(
        "Solyc10g008120",
        "Solyc02g069920",
        "Solyc08g062250"))
    
    gene__pathway =
      data_frame(
        gene = c(
          "Solyc10g008120",
          "Solyc02g069920",
          "Solyc02g069920",
          "Solyc04g005180"),
        pathway = c(
          "1,3,5-trimethoxybenzene biosynthesis",
          "1,4-dihydroxy-2-naphthoate biosynthesis I",
          "1,4-dihydroxy-2-naphthoate biosynthesis I",
          "1,4-dihydroxy-2-naphthoate biosynthesis I"))
    
    result = 
      gene.interested %>%
      left_join(gene__pathway) %>%
      group_by(gene) %>%
      summarize(pathways = pathway %>% paste(collapse = "; "))
    

    【讨论】:

      【解决方案3】:

      这就是我理解你想要做什么的方式: (1) 循环遍历第一个文件中的每个基因, (2) 在第二个文件中查找与该基因相关的所有通路, (3) 创建一个新文件或 R 对象,其中每个项目都包含基因和所有相关通路。

      我假设每个基因的通路数量是不同的。因此,您可能希望将搜索功能的结果存储在列表对象中。另外,我认为您提供的数据样本中没有任何匹配项。我用“Solyc07g064990”替换了路径文件中的一些条目来说明。

      # GENE LOOKUP
      
      # load data
      # genes is loaded as vector to reduce clutter below
      genes <- read.csv('genes.csv', header = F, stringsAsFactors = F)[,1]
      pathways <- read.csv('pathways.csv', header = F, stringsAsFactors = F)
      
      # create empty list to store gene/pathway matches
      compiled <- list()
      
      # loop through genes
      for(i in genes)
      {
            # store matching indices from pathways table
            matches <- grep(i,pathways[,1])
            # create new entry in 'compiled', giving it the current gene name (i)
            compiled[[i]] <- pathways[matches,2]
      }
      

      如果您想获取示例数据,也可以将其粘贴在 github 上。 https://github.com/brlancer/stackex/tree/master/gene%20var%20lookup

      顺便说一句,第一次为 Stack Overflow 做贡献。欢迎反馈!

      【讨论】:

        【解决方案4】:

        这是我的dplyr 尝试(我正在学习 dplyr,因此非常感谢任何简化的反馈):

        # Create some dummy data
        dat <- data.frame(gene = c(rep("a", 2), "b", rep("c", 2)),path = paste("path", 1:5))
        
        # Load dplyr
        
        library(dplyr)    
        
        dat %>% 
          group_by(gene) %>% 
          mutate(newpath=paste(.$path,collapse=", ")) %>% 
          distinct(gene) %>% 
          select(gene,newpath) %>%
          filter(gene %in% a$ID)
        

        group_by 正是这样做的:按gene 分组;然后添加一个新列(mutate,它有一个由每个基因的所有paths 串联而成的字符串。会有重复的条目,所以我们需要保留distinct 记录。最后,我们删除初始path 变量,因为它不再需要了。

        结果(对于虚拟数据)如下所示:

        Source: local data table [3 x 2]
        
            gene        newpath
          (fctr)          (chr)
        1      a path 1, path 2
        2      a path 1, path 2
        3      b         path 3
        

        ####### 编辑添加#######

        我错过了您仅查看 a 数据框中包含的那些基因的请求。为此,请检查修改后的代码(最后一行:filter)。

        对于data.table 解决方案:

        library(data.table)
        dat[,newpath:=paste(path,collapse=", "),by=gene][!duplicated(gene)][gene %in% a$ID]
        

        在第一个链式命令中,我们使用连接路径创建新变量newpath,显然按gene 分组。在第二个“盒子”中,我们声明我们不想要重复的基因记录。最后一个只过滤a$ID中的那些基因。

        【讨论】:

          猜你喜欢
          • 2016-04-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-21
          • 1970-01-01
          • 2020-03-06
          相关资源
          最近更新 更多