2017-02-10 107 views
0

私は各ラベルの3つのサンプルにわたってデータにanovaとTukeyHSDを実行するループを作成しようとしています。この場合のラベルは代謝経路である。それに入るデータは、前記代謝経路で発現される遺伝子である。Rループ全体のデータフレームを構築するための要素

テストデータについて、私は自分のエラーを再現する小さなdfを作成しました。私の実際のデータでは、2つの要因(1つだけではない)でこれを実行することを望んでおり、何千もの行があります。

library(reshape2) 
df<-melt(data.frame(sample1 = c(0,0,3,4,5,1),sample2 = c(1,0,0,4,5,0),sample3 = c(0,0,0,8,0,0),Label = c("TCA cycle", "TCA cycle","TCA cycle", "Glycolysis","Glycolysis","Glycolysis"),Gene = c("k1","k2","k3","k4","k5","k6"))) 

私のアプローチ(私ができる最善の方法を注釈付き!):

fxn<-unique(df$Label) #create list 
for (i in 1:length(fxn)){ 
if (!exists("data")){ #if the "data" dataframe does not exist, start here! 
    depth<-aov(df$value[df$Label==fxn[i]]~df$variable[df$Label==fxn[i]]) #perform anova on my "df", gene values as a factor of samples (for each "fxn") 
    hsd<-TukeyHSD(depth) #calculate tukeyHSD 
    data<-as.data.frame(hsd$`df$variable[df$Label == fxn[i]]`) #grab dataframe of tukey HSD output 
    data$Label<-fxn[i] #add in the Label name as a column (so it looks like my original df, but with TukeyHSD output for each pairwise comparison 
    data<-as.data.frame(data) 
} 
if (exists("data")){ #if "data" exists, do this: 
    tmpdepth<-aov(df$value[df$Label==fxn[i]]~df$variable[df$Label==fxn[i]]) 
    tmphsd<-TukeyHSD(tmpdepth) 
    tmpdata<-as.data.frame(tmphsd$`df$variable[df$Label == fxn[i]]`) 
    tmpdata$Label<-fxn[i] 
    tmpdata<-as.data.frame(tmpdata) 
    data<-rbind(data,tmpdata) #combine with original data 
    data<-as.data.frame 
    rm(tmpdata) 
    } 
} 

私は私の出力は次のようになりたいのですが:

     diff  lwr  upr  p adj  Label 
sample2-sample1 -0.3333333 -8.600189 7.933522 0.9916089 Glycolysis 
sample3-sample1 -0.6666667 -8.933522 7.600189 0.9669963 Glycolysis 
sample3-sample2 -0.3333333 -8.600189 7.933522 0.9916089 Glycolysis 

が、ラベルの列はすべて持っています"fxn"に入った要因。

エラー:

Error in rep(xi, length.out = nvar) : 
    attempt to replicate an object of type 'closure' 
+0

rbindの代わりにrbind.fillを使用できるかどうかも疑問です。これは、どこかのデータが欠落している場合、このループをより堅牢にするのに役立ちます。 – shu251

+0

はい、そうです! – HelloWorld

答えて

1

あなたはRM(tmpdata)前の最後の行に二dataを忘れてしまいました。それは次のようになります。 data<-as.data.frame(data)

次のように私は私の実装では、私はあなたのコードを変更する:あなたは、IF文を必要としない手の前に

datav <- data.frame(diff = double(), 
    lwr = double(), 
    upr = double(), 
    'p adj' = double(), 
    'Label' = character()) 

for (fxn in unique(df$Label)){ 
    depth <- aov(df$value[df$Label==fxn] ~ df$variable[df$Label==fxn]) 
    hsd <- TukeyHSD(depth) 
    tmp <- as.data.frame(hsd$`df$variable[df$Label == fxn]`) 
    tmp$Label <- fxn 
    datav <- rbind(datav, tmp) 
} 

はdata.frameを初期化します。またdataはRの関数なので、変数データの名前をdatavに変更します。

関連する問題