【问题标题】:Unable to calculate mean using aggregate for table, result comes out as N/A无法使用聚合表计算平均值,结果显示为 N/A
【发布时间】:2019-04-13 01:59:47
【问题描述】:

目前使用 R 计算给定表中性别和基因型的每种组合的平均值和标准差:

id Sex     Genotype  Activity
  1 male    ff        1.884 
  2 male    ff        2.283 
  3 male    fs        2.396 
  4 female  ff        2.838   
  5 male    fs        2.956 
  6 female  ff        4.216 
  7 female  ss        3.620 

我使用该函数制作了一个名为 tabled 的表格

tabled <- table(data$Sex, data$Genotype)

当我尝试计算平均值时,我尝试以下函数:

aggregate(data$Sex ~ data$Genotype, by=list(data$Genotype), FUN=mean)

我得到的输出是

Group.1 data$Sex
<fctr> <dbl>
ff     NA           
fs     NA           
ss     NA           
3 rows

我做错了什么? 谢谢!

【问题讨论】:

  • aggregate(Activity ~., data[-1], FUN=mean)
  • 您将aggregate 的两种风格混为一谈。公式版本包括 by 分组。选择一个而不是另一个。
  • 4男3女的平均值是多少?

标签: r


【解决方案1】:

我们可以使用公式法。在这里,我们通过删除第一列 (data[-1]) 对感兴趣的列进行子集化,指定要在 ~ 的 lhs 上汇总的列('Activity) and complete the formula with.`(表示所有其他列)

aggregate(Activity ~., data[-1], FUN=mean)
#    Sex Genotype Activity
#1 female       ff   3.5270
#2   male       ff   2.0835
#3   male       fs   2.6760
#4 female       ss   3.6200

在 OP 的代码中,将公式方法与data.frame 方法混合在一起。

【讨论】:

  • 我正在考虑删除第一个 ID 角色,我很感激,这正是我正在寻找的答案。 Activity到底是什么~。在这种情况下怎么办?你能解释一下吗?
  • @Janus 当我们有 n 列时,如果其中一列用于取均值,则其余为 n-1,这 n-1 列是 @987654326 表示的分组变量@
  • 另一种更明确的方式:聚合(Activity ~ Sex + Genotype, data=data, FUN=mean)
【解决方案2】:

您正在使用公式表示法以及 by 参数。我认为这是多余的。

你也没有告诉聚合你想要取平均值,这是错误的原因(平均值只适用于数值)。

对于公式样式,请使用 akrun 的答案。这是一个带有“by”参数的解决方案。

with(data, aggregate(list("Activity"=Activity), by=list("Genotype"=Genotype, "Sex"=Sex), FUN=mean))

【讨论】:

  • 确保还发送命名列表以获得比 Group.#x 更好的列标题:with(data, aggregate(list(Activity=Activity), by=list(Genotype=Genotype, Sex=Sex), FUN=mean))
【解决方案3】:

您可以使用 data.table 包执行类似的操作 -

> library(data.table)
> setDT(dt)[,mean:=mean(Activity),by=.(Sex,Genotype)]

> dt
   id    Sex Genotype Activity   mean
1:  1   male       ff    1.884 2.0835
2:  2   male       ff    2.283 2.0835
3:  3   male       fs    2.396 2.6760
4:  4 female       ff    2.838 3.5270
5:  5   male       fs    2.956 2.6760
6:  6 female       ff    4.216 3.5270
7:  7 female       ss    3.620 3.6200

> setDT(dt)[,mean(Activity),by=.(Sex,Genotype)]

      Sex    Genotype     V1
1:   male       ff     2.0835
2:   male       fs     2.6760
3: female       ff     3.5270
4: female       ss     3.6200

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 2018-11-16
    • 2023-04-05
    • 2012-10-11
    • 2014-08-12
    • 2015-03-04
    • 1970-01-01
    相关资源
    最近更新 更多