一式三份的平均值,保留标签

Mean of triplicate values, keeping labels

我正在使用 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 的新手,而且难以理解!

谢谢

这是使用 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

可以使用base Raggregate的公式方法。使用 'ID' 和 'Ancestry' 作为分组变量。您可能丢失 'ID' 的一个原因是数据集可能在该特定 'ID' 的任何列中有一些 NA 元素。默认情况下,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。我们将'data.frame'转换为'data.table'(setDT(dc.forehead)),按'ID'和'Ancestry'分组,循环(lapply(.SD, ..)列得到mean.

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 sheet 可能有一些元素是 #REF。纠正此问题的一种方法是使用 na.strings=#REF 读取数据到 return 这些元素作为 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))