R计算子集中所有子组的均方
R calculate mean square for all sub groups in a subset
如何使用值列计算所有 2019_Preston_STD、2019_Preston_V1、2019_Preston_V2 等的均方,然后是 adjmth1、adjmth3 列
structure(list(IDX = c("2019_Preston_STD", "2019_Preston_V1",
"2019_Preston_V2", "2019_Preston_V3", "2019_Preston_W1", "2019_Preston_W2"
), Value = c(3L, 2L, 3L, 2L, 3L, 5L), adjmth1 = c(2.87777777777778,
1.85555555555556, 2.01111111111111, 1.77777777777778, 3.62222222222222,
4.45555555555556), adjmth3 = c(2.9328763348507, 2.08651828334684,
2.80282946626847, 2.15028039284054, 2.68766916156347, 4.51425274916654
), adjmth13 = c(2.81065411262847, 1.82585524933201, 1.81394057737959,
1.40785681078568, 3.30989138378569, 4.7301083495049)), row.names = 29:34, class = "data.frame")
此任务可以通过多种方式完成,如@r2evans 指出的 link 所示。我最喜欢的是 dplyr
使用 summarize(across()
因为对我来说它的语法很容易理解并且很容易应用于许多列。它还以漂亮的格式显示结果数字。
例如,我想从 iris
数据中得到每个物种的 Sepal.Length
、Petal.Length
和 Petal.Width
的算术 mean
: setosa、versicolor 和 virginica。这是数据的头部:
head(iris)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3.0 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5.0 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa
下面是获取每个物种的平均值的方法:
iris %>% group_by(Species) %>%
summarize(across(c(Sepal.Length, Petal.Length, Petal.Width), mean))
# A tibble: 3 x 4
# Species Sepal.Length Petal.Length Petal.Width
# <fct> <dbl> <dbl> <dbl>
# 1 setosa 5.01 1.46 0.246
# 2 versicolor 5.94 4.26 1.33
# 3 virginica 6.59 5.55 2.03
至于你的任务,首先你需要定义均方的函数(因为它的定义在一些参考文献中略有不同)。然后,使用 summarize(across())
.
将其应用于数据框
例如,您定义均方函数如下:
meansq <- function(x) sum((x-mean(x))^2)/(length(x)-1)
注:此定义要求length(x)不等于1,否则会产生NaN。
您可以将其应用于您的数据框 newdata
,如下所示:
newdata %>% group_by(IDX) %>%
summarize(across(c(Value, adjmth1, adjmth3), meansq)
如何使用值列计算所有 2019_Preston_STD、2019_Preston_V1、2019_Preston_V2 等的均方,然后是 adjmth1、adjmth3 列
structure(list(IDX = c("2019_Preston_STD", "2019_Preston_V1",
"2019_Preston_V2", "2019_Preston_V3", "2019_Preston_W1", "2019_Preston_W2"
), Value = c(3L, 2L, 3L, 2L, 3L, 5L), adjmth1 = c(2.87777777777778,
1.85555555555556, 2.01111111111111, 1.77777777777778, 3.62222222222222,
4.45555555555556), adjmth3 = c(2.9328763348507, 2.08651828334684,
2.80282946626847, 2.15028039284054, 2.68766916156347, 4.51425274916654
), adjmth13 = c(2.81065411262847, 1.82585524933201, 1.81394057737959,
1.40785681078568, 3.30989138378569, 4.7301083495049)), row.names = 29:34, class = "data.frame")
此任务可以通过多种方式完成,如@r2evans 指出的 link 所示。我最喜欢的是 dplyr
使用 summarize(across()
因为对我来说它的语法很容易理解并且很容易应用于许多列。它还以漂亮的格式显示结果数字。
例如,我想从 iris
数据中得到每个物种的 Sepal.Length
、Petal.Length
和 Petal.Width
的算术 mean
: setosa、versicolor 和 virginica。这是数据的头部:
head(iris)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 5.1 3.5 1.4 0.2 setosa
# 2 4.9 3.0 1.4 0.2 setosa
# 3 4.7 3.2 1.3 0.2 setosa
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5.0 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa
下面是获取每个物种的平均值的方法:
iris %>% group_by(Species) %>%
summarize(across(c(Sepal.Length, Petal.Length, Petal.Width), mean))
# A tibble: 3 x 4
# Species Sepal.Length Petal.Length Petal.Width
# <fct> <dbl> <dbl> <dbl>
# 1 setosa 5.01 1.46 0.246
# 2 versicolor 5.94 4.26 1.33
# 3 virginica 6.59 5.55 2.03
至于你的任务,首先你需要定义均方的函数(因为它的定义在一些参考文献中略有不同)。然后,使用 summarize(across())
.
例如,您定义均方函数如下:
meansq <- function(x) sum((x-mean(x))^2)/(length(x)-1)
注:此定义要求length(x)不等于1,否则会产生NaN。
您可以将其应用于您的数据框 newdata
,如下所示:
newdata %>% group_by(IDX) %>%
summarize(across(c(Value, adjmth1, adjmth3), meansq)