首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在R中仅包含在1到3四分位数之间的数据的平均值。

在R中仅包含在1到3四分位数之间的数据的平均值。
EN

Stack Overflow用户
提问于 2020-03-24 08:11:08
回答 3查看 402关注 0票数 1

我有不同效果的集中值,我一直试图计算每一组分组数据的平均值(根据不同的效果),但只对盒图的第一和第三四分位数之间包含的数据进行计算,使用R,我首先做了盒图(用ggplot),但我看不出这有什么帮助。使用函数ggplot_build(),我只得到四分位数。我也尝试过“聚合()”,但这提供了整个集合的平均值,我不想包含第1和第3四分位数之外的内容。有什么想法吗?谢谢你的帮助。

代码语言:javascript
运行
复制
 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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-03-24 08:28:24

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

代码语言:javascript
运行
复制
set.seed(123)
df <- data.frame(
  V1 = c(rnorm(100))
)

现在将列V1的框图存储为一个对象,在这里调用object

代码语言:javascript
运行
复制
object <- boxplot(df$V1)

检查与object内部关联的统计信息

代码语言:javascript
运行
复制
object$stats
            [,1]
[1,] -1.96661716
[2,] -0.49667731
[3,]  0.06175631
[4,]  0.69499808
[5,]  2.18733299

第二个和第四个值分隔IQR (要检查,可以执行summary(df))。下一步是对这两个值进行子集df$V1,并计算平均值:

代码语言:javascript
运行
复制
mean(df$V1 >= object$stats[2] & df$V1 <= object$stats[4])
[1] 0.5

这就是你如何解决这个问题的方法。由于您似乎有一个比这更复杂的数据,这个解决方案显然必须适应您的数据。如果您需要帮助,您需要显示数据的样子。

例如,如果您有一个包含多个数值变量的数据,您可以一次进行如下计算:

代码语言:javascript
运行
复制
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

编辑

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

代码语言:javascript
运行
复制
set.seed(123)
df <- data.frame(
  V1 = c(rnorm(100)),
  Effect = sample(LETTERS[1:4], 100, replace = T)
)

要通过Effect计算四分位数范围的平均值,可以一次完成:

代码语言:javascript
运行
复制
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
票数 1
EN

Stack Overflow用户

发布于 2020-03-24 08:46:35

我会使用quantile函数。使用与@Chris相同的数据

代码语言:javascript
运行
复制
quantile(df$V1)
         0%         25%         50%         75%        100% 
-2.30916888 -0.49385424  0.06175631  0.69181917  2.18733299 

您可以通过索引quantile(df$V1)[1]或使用probs选项获得这些值。

代码语言:javascript
运行
复制
> quantile(df$V1,probs=.25)
       25% 
-0.4938542 

一旦您有了数据,只需对平均值进行子集和计算(如@Chris所指出的)

票数 1
EN

Stack Overflow用户

发布于 2020-03-24 10:09:07

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

代码语言:javascript
运行
复制
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中的数字向量data.frame

代码语言:javascript
运行
复制
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的平均值。

代码语言:javascript
运行
复制
> dt[Qnums %in% c(2,3), mean(nums)]
[1] 0.05432868

> mean(df$nums[df$Qnums %in% c(2,3)])
[1] 0.05432868
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60827095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档