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.LengthPetal.LengthPetal.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)