在具有多个因子(字符)变量的数据框中聚合(小计)
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:如何从具有多列的数据框中循环遍历每两列组合以进行聚类?