一式三份的平均值,保留标签
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 R
中aggregate
的公式方法。使用 '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))
我正在使用 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 R
中aggregate
的公式方法。使用 '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))