我在 R 中有一个问题,我似乎无法解决。
我有以下数据框:
我想:
- 查找“物种”和“效果”列的独特组合
- 报告属于这个独特组合的浓度
- 如果这种独特的组合出现不止一次,计算平均浓度
并希望获得以下数据框:
我尝试了下一个脚本来获得独特的组合:
UniqueCombinations <- Data[!duplicated(Data[,1:2]),]
但不知道如何从那里开始。
提前感谢您的回答!
蒂娜
创建一些示例数据:
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)
尝试以下方法(感谢 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))
在我结束之前只是为了好玩......假设你data.frame
被称为“dat”,这里还有两个选择:
一个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
一个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