一个命令中的按行正态性、偏度和峰度

Row wise normality, skewness and kurtosis in one command

我的数据是:

X0 X1 X2 X3 category
0  15 4  4  TAH
0  2  5  0  MAT
0  11 9  0  BIO

我想按行计算正态性偏度峰度。主要原因是我有不同行的类别(在专用列中)。有没有函数可以实现这个功能?

我一直在尝试使用 moments 包和 dplyr 包来做到这一点,类似于 post: Function that calculates, mean, variance and skewness at the same time in a dataframe。 但是他们的解决方案是按列而不是按行。

df3 %>%
  gather(category, Val) %>% 
  group_by(category) %>% 
  summarise(Mean = mean(Val), 
            Vari = var(Val), 
            Skew = skewness(Val))

为了正常,我对每一行分别尝试了以下命令:

shapiro.test(df3[1,])

如有任何帮助,我们将不胜感激。

你可以使用rowwise-

library(dplyr)
library(tidyr)

df %>%
  rowwise() %>%
  mutate(Mean = mean(c_across(X0:X3)), 
         Vari = var(c_across(X0:X3)),
         Shap = shapiro.test(c_across(X0:X3))$p.value,
         Skew = moments::skewness(c_across(X0:X3))) %>%
  ungroup

#     X0    X1    X2    X3 category  Mean    Vari   Shap   Skew
#  <int> <int> <int> <int> <chr>    <dbl>   <dbl>   <dbl>  <dbl>
#1     0    15     4     4 TAH       5.75   41.583  0.232  0.84778 
#2     0     2     5     0 MAT       1.75   5.5833  0.220  0.68925 
#3     0    11     9     0 BIO       5      34      0.110  0.058244

与您的尝试类似,您可以获取长格式的数据并计算每个 category(按行)的统计数据。

df %>%
  pivot_longer(cols = -category) %>%
  group_by(category) %>%
  summarise(Mean = mean(value), 
            Vari = var(value), 
            Skew = moments::skewness(value))

你可以试试

library(PerformanceAnalytics)

df %>%
  select(category, X0:X3) %>%
  t %>%
  as.data.frame %>%
  row_to_names(row_number = 1) %>%
  mutate(TAH = as.numeric(TAH),
         MAT = as.numeric(MAT),
         BIO = as.numeric(BIO)) %>%
  sapply(., function(x) list(mean = mean(x), var = var(x), skew = skewness(x), kur = kurtosis(x)))

     TAH        MAT       BIO       
mean 5.75       1.75      5         
var  41.58333   5.583333  34        
skew 0.8477758  0.6892545 0.05824397
kur  -0.8325348 -1.141902 -1.922722