R中的基本变量查找

时间:2015-09-10 02:42:52

标签: r

我有两个文件。一个人有一系列我感兴趣的基因。另一个基因和它们相关的基因。所以第一个列表如下所示:

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列表,但它只返回一个途径,我知道其中一些基因属于多种途径。

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

4 个答案:

答案 0 :(得分:0)

使用一些玩具数据会对此有所帮助:

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

答案 1 :(得分:0)

我想你想做这样的事情。

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 = "; "))

答案 2 :(得分:0)

这就是我理解你要做的事情: (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 btw。欢迎反馈!

答案 3 :(得分:0)

这是我的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,其中包含由每个基因的所有path串联组成的字符串。将有重复的条目,因此我们需要保留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分组。在第二个&#34;框中#34;我们说我们不想要重复的基因记录。最后一个仅过滤a$ID中的那些基因。