首页 文章

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

提问于
浏览
2

我有一个表(data.frame),其中包含数值数据和因子数据,其中有几个是字符变量(例如'species','Fam_name','gear'),我想计算'权重'的小计(总和)和每个's'的“数字”变量 .

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

以下是我 table 的负责人

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'的'齿轮'代码 .

'gear'因子 Reconstruction (感谢BrodieG):

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

问题解决了 :-)

2 回答

  • 0

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

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

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

  • 1

    我假设对于给定的 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
    

相关问题