【问题标题】:Find unique combinations based on two columns and calculate the mean根据两列查找唯一组合并计算平均值
【发布时间】:2012-10-22 18:31:25
【问题描述】:

我在 R 中有一个问题,我似乎无法解决。

我有以下数据框:

Image 1

我想:

  1. 查找“物种”和“效果”列的独特组合
  2. 报告属于这个独特组合的浓度
  3. 如果这种独特的组合出现多次,计算平均浓度

并希望得到以下数据框:

Image 2

我尝试了下一个脚本来获得独特的组合:

UniqueCombinations

但不知道如何从那里开始。

提前感谢您的回答!

蒂娜

【问题讨论】:

  • 欢迎来到 Stack Overflow!您能否将示例数据包含为可重现的 R 代码而不是图像?请参阅stackoverflow.com/q/5963269/892313 了解有关如何操作的一些提示。
  • +1 为“向我们展示您的数据”带来了新的含义
  • -1 为“向我们展示您的数据”带来了新的含义。为什么不向我们展示head(Data)dput(head(Data)) 甚至str(Data)
  • 由于死链接而被否决。

标签: r unique dataframe


【解决方案1】:

创建一些示例数据:

dat <- data.frame(Species = rep.int(LETTERS[1:4], c(4, 1, 3, 2)),
                  Effect = c(rep("Reproduction", 3), "Growth", "Growth",
                             "Reproduction", "Mortality", "Mortality",
                             "Growth", "Growth"),
                  Concentration = rnorm(10))

你可以使用函数aggregate

aggregate(Concentration ~ Species + Effect, dat, mean)

【讨论】:

    【解决方案2】:

    尝试以下方法(感谢 Brandon Bertelsen 的好评):

    创建您的数据:

    foo = data.frame(Species=c(rep("A",4),"B",rep("C",3),"D","D"), 
                     Effect=c(rep("Reproduction",3), rep("Growth",2),
                              "Reproduction", rep("Mortality",2), rep("Growth",2)), 
                     Concentration=c(1.2,1.4,1.3,1.5,1.6,1.2,1.1,1,1.3,1.4))
    

    使用很棒的包 plyr 来获得一点魔力:)

    library(plyr)
    ddply(foo, .(Species,Effect), function(x) mean(x[,"Concentration"]))
    

    这是一个更复杂但更简洁的版本(再次感谢 Brandon Bertelsen):

    ddply(foo, .(Species,Effect), summarize, mean=mean(Concentration))
    

    【讨论】:

    • 清洁工:ddply(foo,.(Species,Effect),...
    • 清洁工:...,.(Species, Effect), summarize, mean=mean(Concentration))
    • 感谢您的回答!我想问一个关于这个答案的问题,但我不能把它放在这个盒子里,因为我也想广告 R 脚本和输出。最好的方法是什么?我应该从一个新的问题页面开始吗?谢谢,蒂娜
    • @TinaVanRegenmortel 欢迎您提出新问题。以对其他人有用的方式编写它,在发布您的问题之前,搜索一些以确保您的问题尚未在 StackOverflow 上得到回答
    【解决方案3】:

    在我结束之前只是为了好玩......假设你的data.frame被称为“dat”,这里还有两个选项:

    1. data.table 解决方案。

      library(data.table)
      datDT <- data.table(dat, key="Species,Effect")
      datDT[, list(Concentration = mean(Concentration)), by = key(datDT)]
      #    Species       Effect Concentration
      # 1:       A       Growth          1.50
      # 2:       A Reproduction          1.30
      # 3:       B       Growth          1.60
      # 4:       C    Mortality          1.05
      # 5:       C Reproduction          1.20
      # 6:       D       Growth          1.35
      
    2. sqldf 解决方案。

      library(sqldf)
      sqldf("select Species, Effect,
            avg(Concentration) `Concentration`
            from dat
            group by Species, Effect")
      #   Species       Effect Concentration
      # 1       A       Growth          1.50
      # 2       A Reproduction          1.30
      # 3       B       Growth          1.60
      # 4       C    Mortality          1.05
      # 5       C Reproduction          1.20
      # 6       D       Growth          1.35
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 2014-11-04
      • 2020-03-03
      • 2021-05-18
      相关资源
      最近更新 更多