在具有多个因子(字符)变量的数据框中聚合(小计)

Posted

技术标签:

【中文标题】在具有多个因子(字符)变量的数据框中聚合(小计)【英文标题】:Aggregating (subtotals) in data frame with multiple factor (character) variables 【发布时间】:2014-02-15 23:18:21 【问题描述】:

我有一个表(data.frame),其中包含数字数据和因子数据,其中几个是字符变量(例如“物种”、“Fam_name”、“齿轮”),我想在其中计算小计(总和)每个“ss”的“权重”和“数字”变量。

我曾尝试使用“聚合”函数,但未能让它返回“齿轮”变量的字符值。

下面是我的表头

   survey station         ss species weight number bdep      lon      lat                       Sci_name       Fam_name gear
1 2012901       1 2012901001 CARSC04  11.20     20   23 37.61650 19.14900        Scomberoides lysan     CARANGIDAE   TB
2 2012901       1 2012901001 SCMGR02   0.98      2   23 37.61650 19.14900 Grammatorcynus bilineatus     SCOMBRIDAE   TB
3 2012901       2 2012901002 NOCATCH   0.00      0    6 38.48333 18.71667                  NO CATCH       NO CATCH   TB
4 2012901       3 2012901003 LUTLU06   5.65      1    6 38.48333 18.71667            Lutjanus bohar     LUTJANIDAE   TB
5 2012901       3 2012901003 SHACAB1   4.00      1    6 38.48333 18.71667         Triaenodon obesus CARCHARHINIDAE   TB
6 2012901       4 2012901004 NOCATCH   0.00      0    9 38.48333 18.71667                  NO CATCH       NO CATCH   TB

我尝试使用以下代码,目的是使用绑定将两者结合起来,

catch1<-aggregate(cbind(weight, number) ~ ss, data = catch, FUN = sum) 

catch2<-aggregate(cbind(survey, station, bdep, lon, lat, gear) ~ ss, data = catch, FUN=median) 

但是,虽然第一行做了我想要的 - 对每个 'ss' 求和,而另一行导致 'gear' 的数字中位数,而我希望它返回那个特定 'ss' 的 'gear' 代码。

重建“齿轮”因素(感谢 BrodieG):

catch2$gear <- factor(levels(catch$gear)[catch2$gear], levels=levels(catch$gear))

问题解决了:-)

【问题讨论】:

我建议你为 gear 和 ss 提供一个稍微大一点的示例数据集,如果它们是唯一导致问题的两个变量。还要根据更大的示例数据集提供您想要的答案。 'gear' 只是上面代码中的一个示例 - 我试图在所有因素信息都到位的情况下为每个 'ss' 输出一行。我可以提供更大的数据集,但我包含的标题是一个很好的例子,因为 'ss'=2012901001 和 2012901003 都有两行数据。 【参考方案1】:

您的问题是 gear 是一个因子,因此 median 返回因子数值的中位数。试试:

catch2$gear <- factor(levels(catch$gear)[catch2$gear], levels=levels(catch$gear))

或类似的东西来重构catch2的因子。

【讨论】:

+1。当我试图解决时,我假设在一个 ss 中可能有两种 gear 并且我没有尝试过任何工作,至少如果有四行数据并且两行有一个 gear 类型并且两行有另一个. 马克:很抱歉造成混乱。对于每个“ss”,只有一种“齿轮”。 @ErikJS 没问题。我为单个ss 中可能存在多种gear 的场景添加了答案。【参考方案2】:

我假设给定的ss 可能有两种gear。在这种情况下,问题归结为找到字符变量的中位数(或众数)。这是查找字符变量模式的代码(此处为gear)。

catch <- read.table(text = '
         ss  gear
          1    AA
          1    AA
          1    BB
          1    BB
          2    CC
          2    CC
          2    CC
          3    BB
          4    AA
          4    CC
', header = TRUE)

gear.mode <- tapply(catch$gear, catch$ss, function(x)  y = table(x) ; names(y)[y==max(y)] )
gear.mode <- as.data.frame(gear.mode)
gear.mode

  gear.mode
1    AA, BB
2        CC
3        BB
4    AA, CC

您也可以使用aggregate

aggregate(gear ~ ss, data = catch, FUN = function (x) 
   y = table(x) ; names(y)[y==max(y)] 
)

  ss   gear
1  1 AA, BB
2  2     CC
3  3     BB
4  4 AA, CC

【讨论】:

以上是关于在具有多个因子(字符)变量的数据框中聚合(小计)的主要内容,如果未能解决你的问题,请参考以下文章

进行聚合时如何忽略数据框中的特定列

Python:如何从具有多列的数据框中循环遍历每两列组合以进行聚类?

Dask数据框中的多个聚合用户定义函数

为啥我无法在 Hive 中使用具有多个插入子句的高级聚合功能?

实验13-SPSS-因子分析-对商户降维综合评价

如何通过Elasticsearch 6.x中的动态或未知字段进行聚合