Я запускаю код, в котором я беру один ген из списка генов, нахожу его ген 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 для этого, любая помощь будет оценена.
Благодарю за ваш ответ. Я добавил, что data1 и data2 являются локусами и генелистами, а также добавил, как выглядит файл keras. Вывод находится внизу, и это именно то, что я хочу получить, но с итеративным кодом, выполняющим каждый ген за 1 раз, а не по 1 за раз, как я сейчас делаю, записывая вручную в CPEB4.
Почему в выводе для ACE keras.prediction указано 1, а не NA?
Извините, я сделал эти наборы данных для примера и пропустил ACE - теперь он там
Что-то вроде этого должно работать:
#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 был в порядке совпадающих идентификаторов, сгруппированных вместе, мог ли бы быть шаг, который я мог бы добавить после слияния для достижения этой цели?
Затем вы можете заказать, используя order
, что-то вроде myResult <- myResult[ order(myResult$rssnp1), ]
Не очень понятно, не могли бы вы предоставить примеры строк из кадров данных
loci
,geneslist
,keras
.... и ожидаемый результат для этих строк.