2016-11-20 53 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)'在这种情况下,当使用所有变量时,点符号也适用。 –