Как извлечь данные из одного файла на основе идентификаторов другого

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

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

Данные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 (имя файла: Genelist):

    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    

Как я могу заставить это перебирать каждый ген, а не по одному за раз, когда я называю его вручную? Я новичок, поэтому я не уверен, с чего начать создание цикла for для этого, любая помощь будет оценена.

Не очень понятно, не могли бы вы предоставить примеры строк из кадров данных loci, geneslist, keras.... и ожидаемый результат для этих строк.

zx8754 22.05.2019 14:37

Благодарю за ваш ответ. Я добавил, что data1 и data2 являются локусами и генелистами, а также добавил, как выглядит файл keras. Вывод находится внизу, и это именно то, что я хочу получить, но с итеративным кодом, выполняющим каждый ген за 1 раз, а не по 1 за раз, как я сейчас делаю, записывая вручную в CPEB4.

DN1 22.05.2019 14:44

Почему в выводе для ACE keras.prediction указано 1, а не NA?

zx8754 22.05.2019 15:00

Извините, я сделал эти наборы данных для примера и пропустил ACE - теперь он там

DN1 22.05.2019 15:13
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
4
225
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 был в порядке совпадающих идентификаторов, сгруппированных вместе, мог ли бы быть шаг, который я мог бы добавить после слияния для достижения этой цели?

DN1 22.05.2019 16:12

Затем вы можете заказать, используя order, что-то вроде myResult <- myResult[ order(myResult$rssnp1), ]

zx8754 23.05.2019 09:04

Другие вопросы по теме