使用多个因子(字符)变量在数据框中聚合(小计)

时间:2014-02-15 23:18:22

标签: r sum dataframe aggregate subtotal

我有一个带有数字数据和表的数据表(data.frame)。因子数据中有几个是字符变量(例如'species','Fam_name','gear'),我想计算每个's'的'weight'和'number'变量的小计(sum)。

我尝试过使用'aggregate'函数,但是我没有让它返回'gear'变量的字符值。

以下是我桌子的负责人

   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

我尝试使用以下代码,目的是使用bind,

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

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

虽然第一行做了我想要的 - 每个's'的总和,另一个导致'齿轮'的数字中位数,而我希望它返回特定'ss'的'齿轮'代码。

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

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

问题解决了: - )

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

我认为对于给定的gear,可能有两种ss。在这种情况下,问题归结为找到字符变量的中位数(或模式)。以下是查找字符变量模式的代码(此处为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