Как извлечь данные из одного файла на основе идентификаторов для другого - PullRequest
1 голос
/ 22 мая 2019

Я выполняю код, в котором я беру один ген из списка генов, нахожу его ген Sentinel в Data1, а затем выбираю все строки с соответствующим идентификатором rssnp1 для гена в его строке Sentinel. Однако в настоящее время мой код запускает только один ген за раз, я пытаюсь запустить его, чтобы он перебирал каждый ген в моем списке генов в Data2, создавая либо 1 файл со всеми выходными данными, либо отдельные файлы на ген.

Мои данные выглядят так:

Данные1 (имя файла: loci):

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

Данные2 (имя файла: genelist):

    gene
    CPEB4
    GML
    TBX2
    PNKD
    JMJD1C
    SKI
    MYH11
    ACE

У меня также есть 3-й файл данных, который является классом, который был предсказан геном при машинном обучении керас (столбец меток 0-3 для каждого гена), и я добавляю этот столбец после извлечения данных для генов на этом этапе. Местоположение rssnp1.

Данные3 (имя файла: 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, любая помощь будет признательна.

1 Ответ

1 голос
/ 22 мая 2019

Примерно так должно работать:

#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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...