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.table
或 data.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
我有不同效应的浓度值,我一直在尝试计算每组分组数据(按不同效应)的平均值,但仅限于包含在第一个和第三个四分位数之间的数据箱线图,通过使用 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.table
或 data.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