2013-06-18 2 views
1

나는 모든 유전자에 대해 가능한 각각의 SNP에 대해 서로 다른 유전자 열과 -log(P-values)에 해당하는 열이있는 행렬을 가지고 있습니다.R : 루프의 배열에 요소를 초기화하고 추가하는 방법

그래서 행렬에는 Gene_lable, SNP 및 minus_logpval의 3 개의 열이 있습니다. 각 유전자에 대해 가장 높은 숫자의 -log(P-value)을 가진 SNP를 식별하는 코드를 작성하려고합니다.

for(i in 1:254360) { 
max_pval = 0 
if(data$Gene_label[i]==data$Gene_label[i+1]) { 
    x = array(NA, dim=c(0,2)); 
    x[i] = data$minus_logpval[i]; 
    x[i+1] = data$minus_logpval[i+1]; 
    temp = max(x); 
    if (temp>max_pval) { 
    max_pval=temp 
    line = i 
    } 

그러나 어떤 이유로, R은 나에게 오류를주고 유지

가 : Error in is.ordered(x) : argument "x" is missing, with no default. 내가도 사용하지 않았다가이 코드의 시작

SNP   Gene_label   minus_logpval 
1 rs3934834 HES4/ENSG00000188290  14.1031 
2 rs3766193 HES4/ENSG00000188290  7.0203 
3 rs3766192 HES4/ENSG00000188290  10.7420 
4 rs3766191 HES4/ENSG00000188290  10.4323 
5 rs9442371 HES4/ENSG00000188290  10.2941 
6 rs9442372 HES4/ENSG00000188290  8.4235 

입니다 : 여기 머리 (데이터)의 정렬 된 (x) 함수 ... 나는 (배열이어야합니다) x 초기화 된 방법으로 오류가 생각하지만 그것을 수정하는 방법을 모르겠습니다.

+1

당신이 코드가 재현 확인하시기 바랍니다 수 있습니다 (minus_logpvalmax에 관한 snp을 찾기) (Gene_label에 의해) 부분 집합에 최대 data.frame을 분할하고 각 부분에서 작동? – Michele

+0

답장을 보내 주셔서 감사합니다. 재현성이 무엇을 의미하는지 확신 할 수 없으면 전체 코드를 보시겠습니까? – zfz

+0

@zfzhao [** 작은 재현 가능한 예 **] 만드는 방법에 대한이 게시물을 읽으십시오 (http://stackoverflow.com/q/5963269/1478381). –

답변

0

완벽한 사용을 사용하여 루프 withou을 시도 할 수 있습니다.

## Reproducible example data 
set.seed(1234) 
df <- data.frame(Gene_label = rep(letters[1:3] , 3) , snp = rep(letters[5:7] , each = 3) , minus_logpval = rnorm(9)) 
df 
# Gene_label snp minus_logpval 
#1   a e -1.2070657 
#2   b e  0.2774292 
#3   c e  1.0844412 
#4   a f -2.3456977 
#5   b f  0.4291247 
#6   c f  0.5060559 
#7   a g -0.5747400 
#8   b g -0.5466319 
#9   c g -0.5644520 

## And a single line using 'ddply' 
require(plyr) 
ddply(df , .(Gene_label) , summarise , SNP = snp[which.max(minus_logpval)]) 
# Gene_label SNP 
#1   a g 
#2   b f 
#3   c e 
+0

안녕하세요, 정말 고마워요. 저는 R에 익숙하지 않고 일반적으로 코딩하고 있으므로 정말 도움이됩니다. 보시다시피, 원본 본문을 편집하여 머리 (데이터)를 포함 시켰습니다. 'DF = data.frame (데이터) 필요 ddply (plyr) (DF (Gene_label), 요약, SNP는 = SNP [which.max (minus_logpval :. 지금, 나는 작업을 시도하고있다)])' 하지만이 코드의 출력을 얻지 못했습니다. 결과를 인쇄하려면 ddply 함수를 호출해야한다고 생각하십니까? 내가 어떻게 할 수 있는지 아십니까? thnx! – zfz

+0

@zfzhao'ddply (df,. (Gene_label), summarize, SNP = SNP [which.max (minus_logpval)])'-'snp'는 data.frame의 칼럼으로 존재하지 않습니다. 'SNP'). 객체를 사용하여 무언가를하고 싶다면 객체에 출력을 지정하는 것을 잊지 마십시오. 'result <- ddply (df,. (Gene_label), summary, SNP = SNP [which.max (minus_logpval)])' –

+0

정말 고마워요! 이것은 나를 위해 일했다 !! :-) – zfz

0

당신은 plyr에서 ddply에 대한 tapply

tab <- expand.grid(gene=letters[1:2], SNP=LETTERS[1:3]) 
tab$minus_logpval <- abs(rnorm(6))*-1 
tab <- tab[do.call("order", tab),] 
tab$SNP <- as.character(tab$SNP) 
with(tab, tapply(minus_logpval, gene, function(x) SNP[which.max(x)])) 

HTH