R如何通过单命令实现按行计算正态性、skewness及kurtosis
R 按行计算正态性、偏度、峰度解决方案
方案1:dplyr rowwise 实现(适配你原有的dplyr使用习惯)
需要提前加载dplyr和moments包:
library(dplyr) library(moments)
示例数据构造
df3 <- read.table(text = "X0 X1 X2 X3 category 0 15 4 4 TAH 0 2 5 0 MAT 0 11 9 0 BIO", header = TRUE)
按行计算代码
如果数值列命名规则统一,推荐用c_across匹配列,无需手动枚举所有数值列:
df_result <- df3 %>% # 开启按行计算模式 rowwise() %>% mutate( # 提取所有以X开头的数值列做计算 normality_p = shapiro.test(c_across(starts_with("X")))$p.value, skewness_val = skewness(c_across(starts_with("X"))), kurtosis_val = kurtosis(c_across(starts_with("X"))) ) %>% # 关闭按行分组,避免后续操作异常 ungroup()
如果数值列没有统一命名规则,手动枚举列即可,把c_across(starts_with("X"))替换为c(X0,X1,X2,X3)即可。
方案2:base R apply 实现
不需要依赖tidyverse生态,适合轻量计算场景:
library(moments) # 取前4列数值列按行遍历计算 row_stats <- t(apply(df3[,1:4], 1, function(x) { c( normality_p = shapiro.test(x)$p.value, skewness_val = skewness(x), kurtosis_val = kurtosis(x) ) })) # 合并分类列与计算结果 df_result <- cbind(df3["category"], row_stats)
注意事项
- Shapiro正态性检验要求样本量在3~5000区间,你当前每行仅4个样本,检验统计效力极低,仅做代码逻辑参考,实际分析建议补充每行的样本量。
- 计算时注意不要将
category分类列传入统计函数,避免数值转换报错。
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

