【问题标题】:How to extract data from one file based on the IDs for another如何根据另一个文件的 ID 从一个文件中提取数据
【发布时间】:2019-05-22 21:27:36
【问题描述】:

我正在运行代码,我从基因列表中取出一个基因,在 Data1 中找到它的 Sentinel 基因,然后选择所有具有匹配 rssnp1 ID 的行与它的 Sentinel 行中的基因匹配。但是,目前我的代码一次只在一个基因上运行它,我正在尝试运行它,以便它将遍历 Data2 中我的基因列表中的每个基因,创建一个包含所有输出的文件或每个基因的单个文件。

我的数据如下所示:

数据1(文件名:基因座):

Chr  Start   End     rssnp1        Type    gene
1   1244733 1244734 rs2286773   LD_SNP  ACE
1   1257536 1257436 rs301159    LD_SNP  CPEB4
1   1252336 1252336 rs2286773   Sentinel    CPEB4
1   1252343 1252343 rs301159    LD_SNP  CPEB4
1   1254841 1254841 rs301159    LD_SNP  CPEB4
1   1256703 1267404 rs301159    LD_SNP  CPEB4
1   1269246 1269246 rs301159    LD_SNP  CPEB4
1   1370168 1370168 rs301159    LD_SNP  GLUPA1
1   1371824 1371824 rs301159    LD_SNP  GLUPA1
1   1372591 1372591 rs301159    LD_SNP  GLUPA1

Data2(文件名:基因列表):

    gene
    CPEB4
    GML
    TBX2
    PNKD
    JMJD1C
    SKI
    MYH11
    ACE

我还有一个第三个数据文件,它是使用 keras 机器学习预测基因的类别(每个基因的标签列 0-3),我在提取基因数据后附加此列rssnp1 位置。

Data3(文件名:keraspredictions)

    gene        keras.prediction
    CPEB4          2
    GML            1 
    TBX2           1
    PNKD           3
    JMJD1C         0
    SKI            1
    MYH11          2
     ACE           1

我正在尝试:

loci <-read.csv('genelocifilter.csv') #Data1
geneslist <-read.csv('genelist.csv')  #Data2
keras <-read.csv('Keraspredictions.csv')  #Machine learning prediction

getFromData1 <- function(geneFromData2 = NULL) {
     if (is.null(geneFromData2)) return()
      geneSentinelSNP <- (loci %>% filter(Type == "Sentinel" & gene == geneFromData2))$rssnp1
      loci %>% filter(rssnp1 == geneSentinelSNP)
  } 

gene <- getFromData1(geneFromData2 = "CPEB4")
#if error here Type == Sentinel needs to be LD_SNP

gene_class <- left_join(gene, keras %>% select(gene, Keras.prediction) , by = "gene")

write.csv(gene_class, "./CPEB4.csv", row.names = FALSE)

这可以输出:

Chr Start   End   rssnp1        Type    gene      Keras.prediction
1   1244733 1244734 rs2286773   LD_SNP  ACE             1

1   1252336 1252336 rs2286773   Sentinel    CPEB4       2    

我怎样才能让这个迭代每个基因,而不是一次我手动命名的 1 个?我是一个初学者,所以我不知道从哪里开始为此创建一个 for 循环,任何帮助将不胜感激。

【问题讨论】:

  • 不是很清楚,您能否提供来自locigeneslistkeras 数据帧的示例行...以及这些行的预期输出。
  • 感谢您的回复。我已经添加了 data1 和 data2 是基因座和基因列表,并添加了 keras 文件的样子。输出在底部,这正是我想要得到的,但是使用迭代代码在 1 中执行每个基因,而不是像我目前在 CPEB4 中手动编写那样一次执行 1。
  • 为什么在 ACE keras.prediction 的输出中是 1,而不是 NA?
  • 抱歉,我制作这些数据集只是为了举例,错过了 ACE——它现在就在那里

标签: r keras bioinformatics


【解决方案1】:

这样的事情应该可以工作:

#using your custom function and dplyr
library(dplyr)

lapply(geneslist$gene, function(i){
  gene <- getFromData1(geneFromData2 = i)
  left_join(gene, keras %>% select(gene, Keras.prediction) , by = "gene")
})

但必须有更简单的方法只是通过合并,例如:

# using just merge
SentinelSNPs <- unique(loci[ loci$Type == "Sentinel", "rssnp1"])
merge(loci[ loci$rssnp1 %in% SentinelSNPs, ], keras, by = "gene", all.x = TRUE)

【讨论】:

  • 谢谢你,合并几乎对我有用,但它给出了所有基因按字母顺序排列的列表,但我需要 rssnp1 ID 按匹配 ID 分组在一起的顺序排列,会不会是我合并后可以添加的一个步骤吗?
  • 然后您可以使用order 订购,例如myResult &lt;- myResult[ order(myResult$rssnp1), ]
猜你喜欢
  • 2017-11-10
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 2018-11-13
  • 2012-06-21
  • 1970-01-01
相关资源
最近更新 更多