我正在使用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的新手并且是我的头脑!
由于
答案 0 :(得分:2)
您可以使用aggregate
中base 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
。我们转换了' data.frame'到' data.table' (setDT(dc.forehead)
),按' ID'和' Ancestry',循环(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