2016-06-24 11 views
1

私は12374行(遺伝子)と785列(セル)でかなり大きいdata.frameを持っています。 rowMeansに従って行を20個のビンにグループ化したいと思います。各ビン内で、同様の平均発現を有する遺伝子と比較しても発現値が非常に変動するアウトライアー遺伝子を同定するために、そのビン内のすべての遺伝子の分散尺度(分散/平均)をz-正規化したい。次に、各ビンから有意に変動する遺伝子を同定するために、zスコア閾値1.7を超える遺伝子を抽出することを望む。私はこれを行うが、ビンの数(私はあることを考えるもの)に関連したエラーに実行するためにdplyrを使用しようとしてきましたビン行と各ビンごとに分散と戻り値を計算する

> head(temp[,1:5]) 
         Cell1    Cell2     Cell3    Cell4     Cell5 
0610007P14RIK   0.1439444   0.0000000    0.000000   0.8759335   0.0000000 
0610009B22RIK   0.0000000   0.6776718    0.000000   0.0000000   0.0000000 
0610009O20RIK   0.1439444   0.0000000    0.000000   0.2735741   0.0000000 
0610010B08RIK   1.4769893   1.1369215    1.124842   0.8759335   1.9544187 
0610010F05RIK   0.7944809   0.0000000    0.000000   0.7016789   0.9144108 
0610010K14RIK   0.1439444   0.0000000    1.124842   0.7016789   0.0000000 

私のデータは次のようになります。これは私の試みです:

library(dplyr) 
library(genefilter) 
n_bins = 20 
temp = data 
temp$dispersion = rowMeans(temp)/rowVars(temp) 
outscore = temp %>% mutate(bin=ntile(dispersion,n_bins)) %>% 
    group_by(bin) %>% mutate(zscore=scale(dispersion),outlier=abs(zscore)>1.7) 

返されるエラーがrror: dims [product 619] do not match the length of object [618]

答えて

0

が改訂されています。ここでは、ソリューションは、dplyrから少し助けを借りて、ベースRである:

library(dplyr) 

# I called the data set 'mydata' 
colnames(mydata)[1]<-"ID" 
a<-which(colnames(mydata)== "ID") 

##from: http://www.inside-r.org/packages/cran/metaMA/docs/rowVars 

rowVars<-function (x,na.rm = TRUE) 
    { 
    sqr = function(x) x * x 
    n = rowSums(!is.na(x)) 
    n[n <= 1] = NA 
    return(rowSums(sqr(x - rowMeans(x,na.rm = na.rm)), na.rm = na.rm)/(n - 1)) 
    } 

mydata$dispersion<-rowMeans(mydata[,-a])/rowVars(mydata[,-a]) 
nbins = 2 # for you, use 20, or however many you want. 
mydata$bin<-ntile(mydata$dispersion, nbins) 


b<-which(colnames(mydata)== "bin") 
temp<-NULL 
mydata$Z<-0 

for(i in unique(mydata$bin)){ 
    temp<-mydata[mydata$bin == i, -c(a,b)]$dispersion 
    temp<-(temp-mean(temp))/sd(temp) 
    mydata[mydata$bin == i, -c(a,b)]$Z<-temp 
    } 

mydata$outlier<-ifelse(abs(mydata$Z) > 1.7, 1, 0) 
mydata.small<-mydata[,c(1,7:10)] ##for display purposes 
mydata.small 

      ID dispersion bin   Z outlier 
0610007P14RIK 1.406851 1 -0.9370254  0 
0610009B22RIK 1.475641 1 -0.1158566  0 
0610009O20RIK 5.502857 2 0.1333542  0 
0610010B08RIK 7.553503 2 0.9266318  0 
0610010F05RIK 2.418036 2 -1.0599860  0 
0610010K14RIK 1.573546 1 1.0528820  0  
関連する問題