根据两列查找唯一组合并计算平均值

Tin*_*tel -1 r unique dataframe

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

我有以下数据帧:

图片1

我想要:

  1. 找到"物种"和"效果"列的独特组合
  2. 报告属于这种独特组合的浓度
  3. 如果这种独特的组合存在多次,则计算平均浓度

并希望得到以下数据帧:

图2

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

UniqueCombinations < - 数据[!重复(数据[,1:2]),]

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

提前感谢您的回答!

蒂娜

Sve*_*ein 6

创建一些示例数据:

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))
Run Code Online (Sandbox Code Playgroud)

你可以使用这个功能aggregate:

aggregate(Concentration ~ Species + Effect, dat, mean)
Run Code Online (Sandbox Code Playgroud)


Ali*_*Ali 5

尝试以下(感谢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))
Run Code Online (Sandbox Code Playgroud)

使用伟大的包装plyr有点神奇:)

library(plyr)
ddply(foo, .(Species,Effect), function(x) mean(x[,"Concentration"]))
Run Code Online (Sandbox Code Playgroud)

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

ddply(foo, .(Species,Effect), summarize, mean=mean(Concentration))
Run Code Online (Sandbox Code Playgroud)

  • 清洁剂:`...,.(种类,效果),总结,平均值=平均值(浓度)) (3认同)

A5C*_*2T1 5

只是为了好玩,我称之为一晚......假设你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
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)