2016-11-20 52 views
0

使用for循環有一個CSV數據集(稱之爲data)如下:我如何R中

CLASS  CoverageT1  CoverageT2  CoverageT3 
Gamma  90    80    75 
Gamma  89    72    79 
Gamma  92    86    75 
Alpha  50    80    67 
Alpha  53    78    60 
Alpha  58    81    75 

我想找回獨特的類和計算平均每個coverage列。

我到目前爲止已經做的是以下幾點:

classes <- subset(data, select = c(CLASS)) 
unique_classes <- unique(classes) 

for(x in unique_classes){ 
    cove <- subset(data, CLASS == x , select=c(CoverageT1:CoverageT3)) 
    average <- colMeans(cove) 
    print(cove) 
} 

其結果是,我得到了以下結果:

CoverageT1 CoverageT2 CoverageT3 
1 90   80   75 
3 92   86   75 
4 50   80   67 
6 58   81   75 

我想根據每一類檢索覆蓋值然後計算平均值。當我打印檢索到的覆蓋值時,我得到了一些行,而另一些則丟失了!

有人可以幫助我解決這個問題

感謝

回答

1

這是我如何解決它的另一種選擇:

coverage_all <- aggregate(coverage , list(class=data$CLASS), mean) 
2

以你的想法,並在by加以包裝。

xy <- read.table(text = "CLASS  CoverageT1  CoverageT2  CoverageT3 
Gamma  90    80    75 
       Gamma  89    72    79 
       Gamma  92    86    75 
       Alpha  50    80    67 
       Alpha  53    78    60 
       Alpha  58    81    75", header = TRUE) 


out <- by(data = xy[, -1], INDICES = list(xy$CLASS), FUN = colMeans) 
out <- do.call(rbind, out) 
out 

     CoverageT1 CoverageT2 CoverageT3 
Alpha 53.66667 79.66667 67.33333 
Gamma 90.33333 79.33333 76.33333 
4

您的代碼不工作,因爲,除其他事項外,您要指派給平均每個迭代和以前丟失

有幾種方法做你正在嘗試做的。這將是我的做法:

library(dplyr) 

data %>% group_by(CLASS) %>% summarise_all(mean) 
4

使用aggregate

aggregate(data, . ~ CLASS , mean) 
+0

哎呀,試圖'骨料(CoverageT1 + CoverageT2 + CoverageT3〜CLASS ,data = xy,FUN = mean)'並且它不起作用。沒有想到使用點符號... –

+0

如果左側有多個變量,則可以執行cbind。 '聚合(cbind(CoverageT1,CoverageT2,CoverageT3)〜CLASS,data = xy,FUN = mean)'在這種情況下,當使用所有變量時,點符號也適用。 –