保留标签的三次重复值的平均值

时间:2015-09-06 01:20:09

标签: r aggregate

我正在使用dc.forehead,它有1014行和33列。但是,这些行一式三份,我需要在保持其类别的同时找到每组三列的列均值。

    ID      Ancestry  X400   X410   X420   etc.
    140819  African   4.550  4.590  4.710
    140819  African   4.310  4.290  4.440
    140819  African   4.420  4.490  4.690
    140822  African   4.190  4.040  3.630
    140822  African   3.591  3.360  3.860
    140822  African   3.890  3.860  3.420
    140844  S. Asian  4.140  3.290  3.880
    140844  S. Asian  3.370  3.720  4.150
    140844  S. Asian  3.260  4.080  3.960
    etc.

我想要的结果是这样的:

    ID      Ancestry  X400  X410  X420 etc.
    140819  African   4.43  4.46  4.61
    140822  African   3.89  3.75  3.63
    140844  S. Asian  3.59  3.70  4.00 
    etc.

我尝试过以下操作,但是我丢失了类别并删除了其中一个ID并将其替换为#REF

    aggregate(dc.forehead[,3:33], by = list(dc.forehead$ID), FUN = mean)

任何帮助都会非常棒:我是R的新手并且是我的头脑!

由于

2 个答案:

答案 0 :(得分:2)

您可以使用aggregatebase R的公式方法。使用' ID'和祖先'作为分组变量。您可能丢失了ID的一个原因是'可能是数据集在任何列中可能有一些NA元素用于该特定的ID'。默认情况下为na.action=na.omit,因此它会删除整行。我们可以将默认值更改为na.action=NULL,现在应该可以使用了。

aggregate(.~ ID + Ancestry, dc.forehead, FUN=mean, na.rm=TRUE, na.action=NULL)
#     ID Ancestry     X400     X410     X420
#1 140819  African 4.426667 4.456667 4.613333
#2 140822  African 3.890333 3.753333 3.636667
#3 140844 S. Asian 3.590000 3.696667 3.996667

或者我们可以使用data.table。我们转换了&#39; data.frame&#39;到&#39; data.table&#39; (setDT(dc.forehead)),按&#39; ID&#39;和&#39; Ancestry&#39;,循环(lapply(.SD, ..)通过列获取mean。< / p>

library(data.table)
setDT(dc.forehead)[, lapply(.SD, mean, na.rm=TRUE), .(ID, Ancestry)]
#       ID Ancestry     X400     X410     X420
#1: 140819  African 4.426667 4.456667 4.613333
#2: 140822  African 3.890333 3.753333 3.636667
#3: 140844 S. Asian 3.590000 3.696667 3.996667

编辑:但是,仍然不清楚(根据示例)你得到#REF的原因。可能原始的Excel工作表可能包含#REF个元素。解决此问题的一种方法是使用na.strings=#REF读取数据,将这些元素返回为NA,即

dc.forehead <- read.csv('yourfile.csv', na.strings='#REF', 
                        stringsAsFactors=FALSE)

数据

dc.forehead <- structure(list(ID = c(140819L, 140819L, 140819L, 140822L, 
140822L, 
140822L, 140844L, 140844L, 140844L), Ancestry = c("African", 
"African", "African", "African", "African", "African", "S. Asian", 
"S. Asian", "S. Asian"), X400 = c(4.55, 4.31, 4.42, 4.19, 3.591, 
3.89, 4.14, 3.37, 3.26), X410 = c(4.59, 4.29, 4.49, 4.04, 3.36, 
3.86, 3.29, 3.72, 4.08), X420 = c(4.71, 4.44, 4.69, 3.63, 3.86, 
3.42, 3.88, 4.15, 3.96)), .Names = c("ID", "Ancestry", "X400", 
"X410", "X420"), class = "data.frame", row.names = c(NA, -9L))

答案 1 :(得分:1)

这是使用dplyr包的方法。

library(dplyr)

dc.forehead %>% group_by(ID, Ancestry) %>%
  summarise_each(funs(mean)) 

      ID Ancestry     X400     X410     X420
1 140819  African 4.426667 4.456667 4.613333
2 140822  African 3.890333 3.753333 3.636667
3 140844 S. Asian 3.590000 3.696667 3.996667