我们假设我有以下示例数据集:
df1 =
ID Group_Type Units
1 A 10
2 A 12
3 A 17
4 B 6
5 B 9
6 D 23
7 D 16
8 D 21
9 G 40
10 G 31
组类型可能是英文字母表中A和Z之间的任何字母。有没有办法同时检测A,B,D和G组(或任何现有组),然后平均每组的单位,并将整个结果分配给矩阵?我认为它看起来像这样:
[,1]
[1,] 13
[2,] 7.5
[3,] 20
[4,] 35
([1,] = A,依此类推...... [,1] =每组平均值)
我知道如何单独完成这些任务,但我不知道如何将其组合成一段易于管理的代码。我最近使用table,unlist和grep来挑选数据框中的单词,但是我无法想象过去。
答案 0 :(得分:6)
假设' df1'是一个' data.frame'。如果它是一个'矩阵' (我怀疑)
df1 <- as.data.frame(df1, stringsAsFactors=FALSE)
df1$Units <- as.numeric(df1$Units)
使用dplyr
library(dplyr)
df1 %>%
group_by(Group_Type) %>%
summarise(Units=mean(Units))
# Group_Type Units
#1 A 13.0
#2 B 7.5
#3 D 20.0
#4 G 35.5
或使用base R
aggregate(Units~Group_Type, df1, FUN=mean, na.action=NULL)
# Group_Type Units
#1 A 13.0
#2 B 7.5
#3 D 20.0
#4 G 35.5
或data.table
library(data.table)
setDT(df1)[, list(Units=mean(Units)), Group_Type]
# Group_Type Units
#1: A 13.0
#2: B 7.5
#3: D 20.0
#4: G 35.5
对于dplyr
,data.table
和aggregate
,您可以使用na.rm=TRUE
选项从NA
计算中删除mean
值。即mean(Units, na.rm=TRUE)
的{{1}}和dplyr/data.table
的{{1}}
或...,FUN=mean, na.rm=TRUE, na.action=NULL)
。 aggregate
默认会删除sqldf
值
avg
假设在&#39;单位&#39;中是否是单个缺失值。对于&#39; Group_Type&#39;并希望输出为NA/null
。
library(sqldf)
sqldf('select Group_Type,
avg(Units) as Units
from df1
group by Group_Type',
method = "raw")
# Group_Type Units
#1 A 13.0
#2 B 7.5
#3 D 20.0
#4 G 35.5