我有不同效果的集中值,我一直试图计算每一组分组数据的平均值(根据不同的效果),但只对盒图的第一和第三四分位数之间包含的数据进行计算,使用R,我首先做了盒图(用ggplot),但我看不出这有什么帮助。使用函数ggplot_build(),我只得到四分位数。我也尝试过“聚合()”,但这提供了整个集合的平均值,我不想包含第1和第3四分位数之外的内容。有什么想法吗?谢谢你的帮助。
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发布于 2020-03-24 08:28:24
您可以访问框图中包含的统计数据。以下是一些说明性数据:
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))。下一步是对这两个值进行子集df$V1,并计算平均值:
mean(df$V1 >= object$stats[2] & df$V1 <= object$stats[4])
[1] 0.5这就是你如何解决这个问题的方法。由于您似乎有一个比这更复杂的数据,这个解决方案显然必须适应您的数据。如果您需要帮助,您需要显示数据的样子。
例如,如果您有一个包含多个数值变量的数据,您可以一次进行如下计算:
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发布于 2020-03-24 08:46:35
我会使用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所指出的)
发布于 2020-03-24 10:09:07
我首先要创建一个新函数,它输出给定向量中每个元素的分位组:
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.table或data.frame中的数字向量data.frame。
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.05432868https://stackoverflow.com/questions/60827095
复制相似问题