首页 > 解决方案 > 一个命令中的逐行正态性、偏度和峰度

问题描述

我的数据是:

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

我想计算 row-wise normalityskewnesskurtosis。主要原因是我在不同的行中有类别(在专用列中)。有没有可以实现这个功能的功能?

我一直在尝试使用moments包和dplyr包来做到这一点,类似于这篇文章: Function that calculates, mean, variance and skewness in 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,])

对此的任何帮助将不胜感激。

标签: rdistributionskewrowwise

解决方案


你可以使用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))

推荐阅读