Заполнение матрицы с помощью цикла for - PullRequest
1 голос
/ 06 июля 2011

Я использую функцию из пакета генетики под названием LD().Чтобы упростить то, что он делает, он по существу берет список генотипов (A / A, A / C, G / A и т. Д.) И создает список значений (D, D ', r и т. Д.).Это выглядит примерно так:

a=LD(genotype1,genotype2)

с результатами, похожими на:

Pairwise LD
-----------
                   D        D'      Corr
Estimates: 0.1419402 0.8110866 0.6029553

              X^2      P-value  N
LD Test: 10.90665 0.0009581958 15

Мне нужны только значения из Corr, поэтому я вызову его с помощью a$r.

У меня есть 2 фрейма данных, и я хочу использовать эту функцию для их декартового произведения:

df1 и df2 - это 2 фрейма данных, каждый столбец (столбец) представляет список генотипов,Я думаю об использовании цикла for для заполнения матрицы:

df1=data.frame(c("A/A","C/C","A/A"),c("G/G","T/T","T/T"))
df2=data.frame(c("A/T","C/T","C/C"),c("A/A","A/T","G/G"))
q=1 # acts as a counter
n=length(df1$col1) # All lists are the same length
k=length(df2$col2) # These are to set the dimensions of the matrix
r=n*k

m=matrix(data=NA, nrow=r, ncol=3, byrow=TRUE, dimnames=list(NULL, c("c14","c19","Link")))

for(i in (1:n))
{
  for(j in (1:k))
  {
    geno1=genotype(df2)[j] #genotype is a function that must be applied to the
    geno2=genotype(df1)[i] #lists before the LD() function can be used
    d=LD(geno1,geno2)

    m=d$r #I only need the values from this section of the output

    ld[q,]=c(names(df1),names(df2),m) #This is supposed to fill out the matrix
                                      #I'm also not sure of how to do that part
    q=q+1 #this is so that the above line fills in the next row with each iteration
  }
}

Когда я запускаю это, я получаю ошибку:

Error in dim(a1) <- a1.d : 
dims [product "some number"] do not match the length of object ["another number"]

Я ожидаю 3 столбцаи множество строк строки с первым столбцом, являющимся именем первого генотипа (имена столбцов df1), второй столбец является именем второго генотипа (имена столбцов df2), а третий столбец со значениями, полученными из LD() функция

Есть совет?Спасибо!

ОБНОВЛЕНИЕ ОТВЕТ: Мне удалось его получить:

q=1 # acts as a counter
n=length(t1$rs.)
k=length(t2$rs.)
r=n*k

ld=matrix(data=NA, nrow=r, ncol=3, byrow=TRUE, dimnames=list(NULL, c("c14","c19","Link")))

for(i in (1:n))
{
  for(j in (1:k))
  {
    deq=LD(genotype(g1[,i]),genotype(g2[,j]))
    m=deq$r
    ld[q,]=c(i,j,m)
    q=q+1
  }
}

1 Ответ

1 голос
/ 28 сентября 2012

У меня трудности с пониманием первой части вашей работы. Почему вы хотите использовать два data.frames? Я обычно передаю data.frame с одной строкой на человека и одной строкой на маркер, а LD рассчитывает все возможные парные сравнения. Тем не менее, давайте предположим, что вы оценили LD, используя пакет LD (да, они говорят, что он устарел, но он все еще лучший!) Вы можете действовать следующим образом:

#extract the correlation r from LD results
tc<-LD.object$"r"
#build a three columns matrix with all the pairwise combination of two markers
pwm<-combn(row.names(tc),2)
pwld<-matrix(NA,nrow=ncol(pwm),ncol=3)
pwld[,1:2]<-pwm[1:2,]
#Fill the matrix
for(aaa in 1:nrow(pwld))
{
pwld[aaa,3]<-tc[pwld[aaa,1],pwld[aaa,2]]
}
...