R 中第一个和第三个四分位数之间包含的数据的平均值

Mean value only of the data contained between the 1st and 3rd quartile in R

我有不同效应的浓度值,我一直在尝试计算每组分组数据(按不同效应)的平均值,但仅限于包含在第一个和第三个四分位数之间的数据箱线图,通过使用 R。我首先(使用 ggplot)绘制了箱线图,但我看不出这有什么帮助。使用函数 ggplot_build(),我只得到四分位数。我也试过 "aggregate()",但这提供了整个集合的平均值,我不想包括第一和第三四分位数之外的内容。有任何想法吗?谢谢你的帮助。

 conc.value Conc.units Effect.group           Effect
1    0.000160000    AI mg/L    systemic        Physiology
2    0.000560000    AI mg/L    systemic        Population
3    0.001090377    AI mg/L    systemic        Population
4    0.001124100    AI mg/L   cell-based        Enzyme(s)
5    0.001686150    AI mg/L    systemic        Population
6    0.002000000    AI mg/L    systemic        Population
7    0.002000000    AI mg/L    systemic        Population
8    0.002000000    AI mg/L    systemic        Population
9    0.002248200    AI mg/L   cell-based        Enzyme(s)
10   0.002248200    AI mg/L   cell-based        Enzyme(s)
11   0.002248200    AI mg/L    systemic        Population
12   0.002248200    AI mg/L   cell-based     Biochemistry
13   0.004000000    AI mg/L    systemic        Population
14   0.004000000    AI mg/L    systemic        Population
15   0.004496400    AI mg/L   cell-based     Biochemistry
16   0.004496400    AI mg/L   cell-based        Enzyme(s)
17   0.004496400    AI mg/L    systemic        Population
18   0.005000000    AI mg/L    systemic        Population
19   0.005000000    AI mg/L    systemic        Population
20   0.005000000    AI mg/L    systemic        Population
21   0.005000000    AI mg/L    systemic        Population
22   0.005000000    AI mg/L    systemic        Population
23   0.005000000    AI mg/L    systemic        Population
24   0.005000000    AI mg/L    systemic        Population
25   0.005000000    AI mg/L    systemic        Population
26   0.005000000    AI mg/L    systemic        Population

您可以访问箱线图中包含的统计数据。以下是一些说明性数据:

set.seed(123)
df <- data.frame(
  V1 = c(rnorm(100))
)

现在将您的列 V1 的箱线图存储为一个对象,在此处调用,嗯,object:

object <- boxplot(df$V1)

检查与 object:

内部关联的统计信息
object$stats
            [,1]
[1,] -1.96661716
[2,] -0.49667731
[3,]  0.06175631
[4,]  0.69499808
[5,]  2.18733299

第二个和第四个值界定了 IQR(要检查,你可以 summary(df))。所以下一步是 subset df$V1 这两个值并计算平均值:

mean(df$V1 >= object$stats[2] & df$V1 <= object$stats[4])
[1] 0.5

这是 在 nuce 中如何解决问题。看起来你有一个比这更复杂的数据框,这个解决方案显然必须适应你的数据。如果您需要这方面的帮助,您需要展示数据的样子。

例如,如果你有一个包含多个数值变量的数据框,你可以像这样一次性完成计算:

set.seed(123)
df <- data.frame(
  V1 = c(rnorm(100)),
  V2 = c(rnorm(100, 1)),
  V3 = c(rnorm(100, 2))
)

lapply(df[,1:3], function(x)  mean(x >= object$stats[2] & x <= object$stats[4]))
$V1
[1] 0.5

$V2
[1] 0.39

$V3
[1] 0.07

编辑:

对于您在最近评论中描述的数据集,解决方案可能是这样的:

set.seed(123)
df <- data.frame(
  V1 = c(rnorm(100)),
  Effect = sample(LETTERS[1:4], 100, replace = T)
)

要通过Effect计算四分位距的均值,您可以一次性完成:

tapply(df$V1, df$Effect, function(x)  mean(x[x >= quantile(x, 0.25) & x <= quantile(x, 0.75)]))
           A            B            C            D 
 0.005502653  0.251196882  0.077304685 -0.108590409

我会使用 quantile 函数。使用与@Chris

相同的数据
quantile(df$V1)
         0%         25%         50%         75%        100% 
-2.30916888 -0.49385424  0.06175631  0.69181917  2.18733299 

您可以通过索引 quantile(df$V1)[1] 或使用 probs 选项

获取值
> quantile(df$V1,probs=.25)
       25% 
-0.4938542 

获得数据后,简单地进行子集化并计算平均值(正如@Chris)指出的

我首先创建一个新函数,它输出给定向量中每个元素的分位数组:

qgroup = function(numvec, n = 4){

  qtile = quantile(numvec, probs = seq(0, 1, 1/n), na.rm = T)
  out = sapply(numvec, function(x) sum(x >= qtile[-(n+1)]))

  return(out)
}

> qgroup(seq(1:20))
 [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4

现在,将此函数应用于 data.tabledata.frame 中的数值向量 nums

set.seed(123)
nums = rnorm(100)

#data.table
dt = data.table(nums)[, Qnums := qgroup(nums)]

#data.frame
df = data.frame(nums)
df$Qnums = qgroup(df$nums)

最后,根据Qnums对数据对象进行子集化,计算数值列nums:

的均值
> dt[Qnums %in% c(2,3), mean(nums)]
[1] 0.05432868

> mean(df$nums[df$Qnums %in% c(2,3)])
[1] 0.05432868