1

私は単純な間違いを犯していると確信しています。

反復する必要がある大きなマトリックス 3307592x9 があり、列 8 (文字/文字列) == 9 (文字/文字列) (大文字と小文字を区別しない) の場合、列 3-7 (数値 0-1) は 1-self である必要があります. 私が書いたコードは次のとおりです。

for (i in 1:3307592){
    if(grepl(chr2SnpFreqNorm[i,8], chr2SnpFreqNorm[i,9], ignore.case=TRUE)){
        chr2SnpFreqNorm[i,3] <- 1 - chr2SnpFreqNorm[i,3]
        chr2SnpFreqNorm[i,4] <- 1 - chr2SnpFreqNorm[i,4]
        chr2SnpFreqNorm[i,5] <- 1 - chr2SnpFreqNorm[i,5]
        chr2SnpFreqNorm[i,6] <- 1 - chr2SnpFreqNorm[i,6]
        chr2SnpFreqNorm[i,7] <- 1 - chr2SnpFreqNorm[i,7]
    }
}

R クライアントを実行しようとすると、コマンドをキャンセルする前に 30 分以上ハングします。コードが正しいように見えるので、何が間違っているのかわかりません。

/edit サンプルデータ

> chr2SnpFreqNorm[1:10,]
        ID   pos ceuChr2SnpFreq chsChr2SnpFreq lwkChr2SnpFreq
1  rs187078949 10133    0.070588235          0.000    0.030927835
2  rs191522553 10140    0.005882353          0.000    0.005154639
3  rs149483862 10286    0.100000000          0.135    0.226804124
4  rs150919307 10297    0.147058824          0.070    0.113402062
5  rs186644623 10315    0.000000000          0.000    0.000000000
6  rs193294418 10345    0.017647059          0.000    0.036082474
7  rs185496709 10386    0.082352941          0.020    0.087628866
8  rs188771313 10419    0.229411765          0.085    0.056701031
9  rs192945962 10425    0.100000000          0.020    0.015463918
10 rs184397180 10431    0.064705882          0.005    0.036082474
   tsiChr2SnpFreq yriChr2SnpFreq ALT AA
1     0.035714286    0.045454545   A  a
2     0.005102041    0.005681818   A  C
3     0.239795918    0.170454545   A  t
4     0.168367347    0.130681818   T  t
5     0.000000000    0.005681818   G  C
6     0.030612245    0.028409091   A  G
7     0.035714286    0.113636364   T  t
8     0.147959184    0.090909091   G  G
9     0.091836735    0.034090909   G  c
10    0.015306122    0.045454545   T  a

>
4

3 に答える 3

1

ベースRでは、簡単に行うことができます

flip <- Vectorize(grepl)(chr2SnpFreqNorm[,8], chr2SnpFreqNorm[,9], ignore.case=TRUE)

chr2SnpFreqNorm[flip,3:7] <- 1 - chr2SnpFreqNorm[filp,3:7]

Vectorizeループを隠すため、これは少し遅いかもしれません。ただし、列 8 と 9 が完全に一致する行を反転するだけでよい場合 (大文字と小文字を区別しない場合)、代わりに次のフィルターを使用します。

flip <- tolower(chr2SnpFreqNorm[,8])==tolower(chr2SnpFreqNorm[,9])
于 2013-08-31T19:53:45.123 に答える
1

forは の友達ではありません。条件付きインデックス作成Rを使用した解決策は次のとおりです。apply

## create some toy data    
matrix( ncol=5, nrow = 100, c( runif(300), sample(c('A','G','C','T','a','c','g','t'), replace=T, 200))) -> data

flip_allele_freqs <- function(x) { 
## function will return 1-x on any x that looks like a number less than 1
    n = as.numeric(x)
    if ( is.na(n) ) { ## cant convert to numeric, must be str
        return(x)
    }
    if (n < 1) {
        return( 1 - n )
    } else {
        return x
    }
}

## apply the flip alleles function to the rows where the two last columns are equal
##fold the new data back into the old matrix

data[toupper(data[,5]) == toupper(data[,4]),] <- 
    apply(data[toupper(data[,5]) == toupper(data[,4]),], c(1,2), flip_allele_freqs)

GWASで頑張ってください!

于 2013-08-31T18:34:18.050 に答える