#r #for-loop #scatter-plot
Вопрос:
У меня есть этот код, который вычисляет значения p для определенных именованных маркеров в файле (объекте gts
). Цикл for создает точечные диаграммы для каждого trait
, определенного в pts
.
pts lt;- read.csv('data_rqtl_phenotypes.csv',as.is=T) gts lt;- read.csv('data_rqtl_genotypes.csv',as.is=T) gts lt;- gts[,c(1,grep('2B',gts[1,]))]### use only 1B gts lt;- gts[,!apply(gts[2,],1,duplicated)]### remove duplicated dim(gts)### 93 229 map lt;- gts[1:2,]### salvage map gts lt;- gts[-c(1:2),] gts[gts=='-'] lt;- NA testdfr lt;- merge(pts,gts,by='id') testdfr[1:5,1:10] pdf('SingleMarkerAnalysis_ParW471_2021_10_21.pdf') for( trait in colnames(pts)[-1]) { print(trait) pValueL lt;- c() for(marker in colnames(gts)) { model lt;- try(lm(testdfr[,trait]~testdfr[,marker])) { if(any("try-error"%in%class(model))) print('not enough data for a test') else { modelsum lt;- summary(model) coeffs lt;- modelsum$coefficient print(coeffs) pValue=coeffs[grep('[AB]
Тем не менее, я хочу взять данные, полученные на каждой итерации, а затем нанести их на одну и ту же точечную диаграмму, чтобы я мог раскрасить каждую из них и посмотреть, как они сравниваются друг с другом. Я не уверен, как заставить цикл выводить каждую итерацию на новый объект, чтобы их можно было построить вместе. если кто-нибудь знает, как это можно сделать, был бы очень признателен!
Комментарии:
1. После выполнения цикла вы получаете
pValueL
объект со всеми значениями из каждой итерации? Затем вы можете использоватьpoints()
функцию для добавления каждого набора значений к исходному графику.2. Ах, спасибо, это помогло. Таким образом, pValueL хранит данные только с одной итерации, а затем заменяется после каждой итерации. Мне удалось создать диаграмму рассеяния, в которой я нуждался, вручную определив "признак" и запустив только второй цикл for для связанных маркеров из " для " (маркер в именах столбцов... и т. Д.", а затем добавление через точки. Я думаю, что если я включу функцию points() в полный цикл, я смогу получить нужный мне сюжет без необходимости делать что-то вручную
,row.names(coeffs)),grep('Pr',colnames(coeffs))] print(pValue) if(length(pValue)gt;0) pValueL[marker] lt;- pValue } } } plot.default(map[2,names(pValueL)],-sapply(pValueL,log10),main=trait,xlab='Chr 1B [cM]', ylab='-log10(pValue)',ylim=c(0,7)) } dev.off() Тем не менее, я хочу взять данные, полученные на каждой итерации, а затем нанести их на одну и ту же точечную диаграмму, чтобы я мог раскрасить каждую из них и посмотреть, как они сравниваются друг с другом. Я не уверен, как заставить цикл выводить каждую итерацию на новый объект, чтобы их можно было построить вместе. если кто-нибудь знает, как это можно сделать, был бы очень признателен!
Комментарии:
1. После выполнения цикла вы получаете
pValueL
объект со всеми значениями из каждой итерации? Затем вы можете использоватьpoints()
функцию для добавления каждого набора значений к исходному графику.2. Ах, спасибо, это помогло. Таким образом, pValueL хранит данные только с одной итерации, а затем заменяется после каждой итерации. Мне удалось создать диаграмму рассеяния, в которой я нуждался, вручную определив «признак» и запустив только второй цикл for для связанных маркеров из » для » (маркер в именах столбцов… и т. Д.», а затем добавление через точки. Я думаю, что если я включу функцию points() в полный цикл, я смогу получить нужный мне сюжет без необходимости делать что-то вручную