【问题标题】:R: Grouping levels of a factor across multiple filesR:跨多个文件对因子的级别进行分组
【发布时间】:2013-02-21 20:52:10
【问题描述】:

我是 R 新手,在计算平均值之前努力对因子的多个级别进行分组。这个问题很复杂,因为我在数百个文件中执行此操作,这些文件具有需要分组的不同级别的因素。我从以前的帖子中看到如何使用级别 () 解决单个级别的分组问题,但是我的数据对于这种方法来说太可变了。

基本上,我想计算一个因素的多个水平的个体平均值和总体平均值。例如,我想计算状态列中存在的以下每个因素的每个物种的平均值:Crypt1、Crypt2、Crypt3、Native、Intro,然后还计算 Crypt 物种的总体平均值(包括 Crypt1、Crypt2、和 Crypt3,但不是 Native 或 Intro)。但是,一个物种要么具有多个级别的 Crypt(可变,最高 Crypt8),要么具有 Native 和 Intro,并且每个级别的所有物种的平均值最终都会被平均到同一个汇总表中。

例如:

Species  Status  Value
A        Crypt1    5 
A        Crypt1    6
A        Crypt2    4
A        Crypt2    8
A        Crypt3    10
A        Crypt3    50
B        Native    2
B        Native    9
B        Intro     9
B        Intro     10

我在想我可以使用每个因子的第一个字母将 Crypt 因子组合在一起,但我正在努力定位第一个字母,因为它们是因子,而不是字符串,我不确定如何在它们之间进行转换.我最终使用聚合()计算均值,并且我可以获得每个因子的单独均值,但不能获得分组因子。 任何想法将不胜感激,谢谢!

【问题讨论】:

    标签: r aggregate plyr


    【解决方案1】:

    对于个人来说:

    # assuming your data is in data.frame = df
    require(plyr)
    df.1 <- ddply(df, .(Species, Status), summarise, ind.m.Value = mean(Value))
    
    > df.1
    #   Species Status ind.m.Value
    # 1       A Crypt1     5.5
    # 2       A Crypt2     6.0
    # 3       A Crypt3    30.0
    # 4       B  Intro     9.5
    # 5       B Native     5.5
    

    对于整体平均值,我们的想法是使用sub/gsub 删除Status 中每个条目末尾的数字。

    df.1$Status2 <- gsub("[0-9]+$", "", df.1$Status)
    df.2 <- ddply(df.1, .(Species, Status2), summarise, oall.m.Value = mean(ind.m.Value))
    
    > df.2
    #   Species Status2 oall.m.Value
    # 1       A   Crypt     13.83333
    # 2       B   Intro      9.50000
    # 3       B  Native      5.50000
    

    这是你所期待的吗?

    【讨论】:

      【解决方案2】:

      这里有一个替代方案。从概念上讲,它与 Arun 的答案相同,但它坚持使用基本 R 中的函数,并且在某种程度上使您的工作区和原始数据保持整洁。

      我假设我们从一个名为“temp”的data.frame 开始,并且我们想要创建两个新的data.frames,“T1”和“T2”分别用于单个和分组方式。

      # Verify that you don't have T1 and T2 in your workspace
      ls(pattern = "T[1|2]") 
      # character(0)
      
      # Use `with` to generate T1 (individual means)
      #   and to generate T2 (group means)
      with(temp, {
        T1 <<- aggregate(Value ~ Species + Status, temp, mean)
        temp$Status <- gsub("\\d+$", "", Status)
        T2 <<- aggregate(Value ~ Species + Status, temp, mean)
      })
      
      # Now they're there!
      ls(pattern = "T[1|2]") 
      # [1] "T1" "T2"
      

      请注意,我们使用&lt;&lt;-with 中的结果分配给全局环境。不是每个人都喜欢使用它,但我认为在这种特殊情况下它是可以的。这是“T1”和“T2”的样子。

      T1
      #   Species Status Value
      # 1       A Crypt1   5.5
      # 2       A Crypt2   6.0
      # 3       A Crypt3  30.0
      # 4       B  Intro   9.5
      # 5       B Native   5.5
      
      T2
      #   Species Status    Value
      # 1       A  Crypt 13.83333
      # 2       B  Intro  9.50000
      # 3       B Native  5.50000
      

      回顾with 命令,我们似乎更改了“状态”列的值。但是,这仅在使用with 创建的环境中。您最初的data.frame 与您开始时的相同。

      temp
      #    Species Status Value
      # 1        A Crypt1     5
      # 2        A Crypt1     6
      # 3        A Crypt2     4
      # 4        A Crypt2     8
      # 5        A Crypt3    10
      # 6        A Crypt3    50
      # 7        B Native     2
      # 8        B Native     9
      # 9        B  Intro     9
      # 10       B  Intro    10
      

      【讨论】:

        猜你喜欢
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 2013-10-29
        • 1970-01-01
        • 1970-01-01
        • 2021-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多