2016-12-19 3 views
0

私は分子と分母の連結名としてrownamesを持つデータフレームを持っているとします。このデータフレームの2つの列は、このデータフレームのエントリであり、分子と分母である。関数に前後するときのベクトルの順序

up<-c("up1","up2","up3","up4") 
down<-c("down1","down2","down3") 

singleRatio<-as.data.frame(expand.grid(up,down)) 
rownames(singleRatio)<-paste(singleRatio$Var1,singleRatio$Var2,sep="_") 
colnames(singleRatio)<-c("numerator","denominator") 

各分子と分母は、num/denomを行として、サンプルを列として対応するエントリをデータフレームに持ちます。

sample1<-c(1,2,3,4,5,1,2) 
sample2<-c(5,4,5,7,2,2,3) 
sample3<-c(2,3,6,5,3,2,3) 
sample4<-c(5,5,5,8,1,2,3) 
data<-data.frame(sample1,sample2,sample3,sample4) 
rownames(data)<-c(up,down) 

私は比率の全てを計算し、(それが下だ場合、それが閾値を、0の上にいた場合1)しきい値にそれらを比較した試験結果の完全なデータフレームを作成したいです。私は各サンプルのすべての比率を見つけるためにgetRatioと呼ばれる機能を持っている

ratios.df<-data.frame(matrix(nrow = length(rownames(singleRatio)),ncol = length(colnames(data)))) 
rownames(ratios.df)<-rownames(singleRatio) 
colnames(ratios.df)<-colnames(data) 
ratios.df 

:これはratios.df作成

getRatio<-function(sampleData){ 
    sampleRatios<-rep(0,each=length(rownames(singleRatio))) 
    names(sampleRatios)<-rownames(singleRatio) 
    for(ratio in rownames(singleRatio)){ 
    sampleRatios[ratio]<-sampleData[singleRatio[ratio,1]]/(sampleData[singleRatio[ratio,1]] + sampleData[singleRatio[ratio,2]]) 
    } 
    return(sampleRatios) 
} 

をそして、これは一緒にすべてを持って私の試みです。

thresholds<-c(0.1,0.5,0.1,0.5,0.1,0.5,0.1,0.5,0.1,0.5,0.1,0.5) 
for (sampleName in colnames(data)){ 
    dataline<-data[,sampleName] 
    names(dataline)<-rownames(data) 
    sampleRatios<-getRatio(dataline) 
    ratios.df[,sampleName]<-sampleRatios 
    #ratios.df[,sampleName]<-ifelse(sampleRatios > thresholds,1,0) 
} 

結果の比率を見ると、何も一致しないという問題があります。 ratio.dfはされてしまう。

> ratios.df 
      sample1 sample2 sample3 sample4 
up1_down1 0.5000000 0.5000000 0.5000000 0.5000000 
up2_down1 0.6666667 0.4444444 0.6000000 0.5000000 
up3_down1 0.7500000 0.5000000 0.7500000 0.5000000 
up4_down1 0.8000000 0.5833333 0.7142857 0.6153846 
up1_down2 0.3333333 0.5555556 0.4000000 0.5000000 
up2_down2 0.5000000 0.5000000 0.5000000 0.5000000 
up3_down2 0.6000000 0.5555556 0.6666667 0.5000000 
up4_down2 0.6666667 0.6363636 0.6250000 0.6153846 
up1_down3 0.2500000 0.5000000 0.2500000 0.5000000 
up2_down3 0.4000000 0.4444444 0.3333333 0.5000000 
up3_down3 0.5000000 0.5000000 0.5000000 0.5000000 
up4_down3 0.5714286 0.5833333 0.4545455 0.6153846 

、元のデータが

> data 
     sample1 sample2 sample3 sample4 
up1   1  5  2  5 
up2   2  4  3  5 
up3   3  5  6  5 
up4   4  7  5  8 
down1  5  2  3  1 
down2  1  2  2  2 
down3  2  3  3  3 

はSAMPLE1ためup1_down1ための比は1 /(+ 5 1)= 0.33ではなく0.50でなければならないことを意味しています。長い話を簡単に言えば、私は何がなぜ、どこで物事がここで交換されているのか分かりません。私が間違っていることを誰でも見ることができますか?

+0

'1 /(1 + 5)= 0.1666667' 「0.33」ではなく) – digEmAll

答えて

1

問題はsingleRatiodata.frameは二つの要因の列ではなく文字が含まれていることですので、あなたは選択のこのような操作を行うとき:sampleData[singleRatio[ratio,1]]を要因ではなく、したがって、誤った値が選択されている文字列表現を取得の整数に強制変換されます。

あなたは(次の行を変更する)文字のdata.frameを作成する場合は、すべてが動作するはずです:

singleRatio<-as.data.frame(expand.grid(up,down,stringsAsFactors=FALSE)) 

結果:

> ratios.df 
      sample1 sample2 sample3 sample4 
up1_down1 0.1666667 0.7142857 0.4000000 0.8333333 
up2_down1 0.2857143 0.6666667 0.5000000 0.8333333 
up3_down1 0.3750000 0.7142857 0.6666667 0.8333333 
up4_down1 0.4444444 0.7777778 0.6250000 0.8888889 
up1_down2 0.5000000 0.7142857 0.5000000 0.7142857 
up2_down2 0.6666667 0.6666667 0.6000000 0.7142857 
up3_down2 0.7500000 0.7142857 0.7500000 0.7142857 
up4_down2 0.8000000 0.7777778 0.7142857 0.8000000 
up1_down3 0.3333333 0.6250000 0.4000000 0.6250000 
up2_down3 0.5000000 0.5714286 0.5000000 0.6250000 
up3_down3 0.6000000 0.6250000 0.6666667 0.6250000 
up4_down3 0.6666667 0.7000000 0.6250000 0.7272727 
関連する問題