R 如何从包含x个可能组的矩阵中提取平均值
假设我有以下示例数据集:R 如何从包含x个可能组的矩阵中提取平均值,r,R,假设我有以下示例数据集: 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
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来挑选数据框中的单词,但我无法从中找出更多的单词。假设“df1”是一个“data.frame”。如果它是一个“矩阵”(我对此表示怀疑) 或使用
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
或数据表
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
值。i、 e.平均值(单位,na.rm=TRUE)
对于dplyr/data.table
和..,FUN=mean,na.rm=TRUE,na.action=NULL)
对于聚合
或sqldf
。默认情况下,avg
将删除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
假设“组类型”的“单位”中缺少一个if值,并希望输出为NA
df1$Units[3] <- NA
sqldf('select Group_Type,
case when count(Units) = count(*)
then avg(Units)
else null
end as Units
from df1
group by Group_Type',
method="raw")
# Group_Type Units
#1 A <NA>
#2 B 7.5
#3 D 20.0
#4 G 35.5
df1$Units[3]假设“df1”是一个“data.frame”。如果它是一个“矩阵”(我对此表示怀疑)
或使用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
或数据表
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
值。i、 e.平均值(单位,na.rm=TRUE)
对于dplyr/data.table
和..,FUN=mean,na.rm=TRUE,na.action=NULL)
对于聚合
或sqldf
。默认情况下,avg
将删除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
假设“组类型”的“单位”中缺少一个if值,并希望输出为NA
df1$Units[3] <- NA
sqldf('select Group_Type,
case when count(Units) = count(*)
then avg(Units)
else null
end as Units
from df1
group by Group_Type',
method="raw")
# Group_Type Units
#1 A <NA>
#2 B 7.5
#3 D 20.0
#4 G 35.5
df1$Units[3]非常感谢您的选择!我现在使用的是base R,但我肯定对dplyr感兴趣。对于这种类型的数据操作,您更喜欢哪一种?@Adam数据表
和dplyr
版本比聚合
版本快。我会记住这一点,谢谢。如果“单位”部分中确实存在NA值,是否有办法在结果中保留NA值?我已尝试将na.rm转换为FALSE,但无效。@Adammean
中的默认选项将是na.rm=FALSE
。因此,如果每个组类型的单位有一个NA值,则该平均值将为NA。你为什么需要这样?对于aggregate
,您可能需要na.action=NULL
我感谢所有的帮助--我只用了17行代码就编写了一段代码,通过对我们最常见的问题之一进行数据分析,我的实验室每个人都将节省大量时间。我的第一个真正的节目!我很感激你的选择!我现在使用的是base R,但我肯定对dplyr感兴趣。对于这种类型的数据操作,您更喜欢哪一种?@Adam数据表
和dplyr
版本比聚合
版本快。我会记住这一点,谢谢。如果“单位”部分中确实存在NA值,是否有办法在结果中保留NA值?我已尝试将na.rm转换为FALSE,但无效。@Adammean
中的默认选项将是na.rm=FALSE
。因此,如果每个组类型的单位有一个NA值,则该平均值将为NA。你为什么需要这样?对于aggregate
,您可能需要na.action=NULL
我感谢所有的帮助--我只用了17行代码就编写了一段代码,通过对我们最常见的问题之一进行数据分析,我的实验室每个人都将节省大量时间。我的第一个真正的节目!