如何在计算每个组的平均值时删除 ddply 中的第 5 个和第 95 个百分位值
How to remove 5th and 95th percentile values in ddply while calculating mean for each group
我有一个大型数据集,每个物种都有几个特征值。我想计算每个值的性状平均值,不包括第 5 个百分位和第 95 个百分位。我正在使用 ddply 函数但无法做到这一点。非常感谢任何帮助。
这是一个函数 mean2
,它计算修剪后的均值。
mean2 <- function(x, na.rm = FALSE, probs = c(0.05, 0.95), ...){
if(na.rm) x <- x[!is.na(x)]
qq <- quantile(x, probs = probs)
keep <- x > qq[1] & x < qq[2]
mean(x[keep], ...)
}
现在mutate
data.frame 和 species
分组后的函数。
library(dplyr)
df %>%
group_by(species) %>%
mutate(mean = mean2(trait))
测试数据创建代码
set.seed(1234)
species <- sample(LETTERS[1:3], 20, TRUE)
trait <- sample(2:8, 20, TRUE)
trait[sample(20, 3)] <- sample(50:60, 3)
trait[sample(20, 1)] <- -2
df <- data.frame(species, trait)
使用 for
循环:
means = numeric()
for(i in df$Species){
x = df$Trait[which(df$Species==i)]
means[i] = mean(x[which(x<=quantile(x,0.95) & x>=quantile(x,0.05))])
}
}
使用的虚拟数据:
df = data.frame(
Species = sample(rep(LETTERS[1:5],8), 40),
Trait = rnorm(40, 5, 3))
我有一个大型数据集,每个物种都有几个特征值。我想计算每个值的性状平均值,不包括第 5 个百分位和第 95 个百分位。我正在使用 ddply 函数但无法做到这一点。非常感谢任何帮助。
这是一个函数 mean2
,它计算修剪后的均值。
mean2 <- function(x, na.rm = FALSE, probs = c(0.05, 0.95), ...){
if(na.rm) x <- x[!is.na(x)]
qq <- quantile(x, probs = probs)
keep <- x > qq[1] & x < qq[2]
mean(x[keep], ...)
}
现在mutate
data.frame 和 species
分组后的函数。
library(dplyr)
df %>%
group_by(species) %>%
mutate(mean = mean2(trait))
测试数据创建代码
set.seed(1234)
species <- sample(LETTERS[1:3], 20, TRUE)
trait <- sample(2:8, 20, TRUE)
trait[sample(20, 3)] <- sample(50:60, 3)
trait[sample(20, 1)] <- -2
df <- data.frame(species, trait)
使用 for
循环:
means = numeric()
for(i in df$Species){
x = df$Trait[which(df$Species==i)]
means[i] = mean(x[which(x<=quantile(x,0.95) & x>=quantile(x,0.05))])
}
}
使用的虚拟数据:
df = data.frame(
Species = sample(rep(LETTERS[1:5],8), 40),
Trait = rnorm(40, 5, 3))