我找到了一种在R中的list
对象中使用data.table
来计算Shapiro Wilkes每个因子的正态性的方法。
irisDT <- data.table(iris)
irisDT[, list(sw_results = shapiro.test(Petal.Width)), by = Species]
从技术上讲,这是正确的,值是按因子运行的。但是,输出并不是特别'整洁'恕我直言。它输出一个长度为12的data.table
,有2列。标识物种的第一列,第二列(创建为sw_results
)列出了测试的所有细节 - 统计,p值,方法和data.name。
如何修改此代码,而不是输出3行的data.table
,每个项目有不同的列,每个因子有行?
我知道我可以通过另一个命令重新整形数据,但是,如果数据集很大,这将是一个额外的挫折。有没有办法用计算来修改线来实现这个目的?
我以lapply
的形式预感:
irisDT[, lapply(.SD$Petal.Width, shapiro.test), by = Species]
然而我收到错误消息“FUN(X [[i]],...)中的错误:样本大小必须介于3和5000之间”。完全irisDT
只有150行,所以我对这个回复感到有些困惑。我的lapply
是否被错误地执行了?还有另一种方法可以更好地实现这一目标吗?
答案 0 :(得分:3)
怎么样?
irisDT[, shapiro.test(Petal.Width), by = Species]
这会给你
Species statistic p.value method data.name
1: setosa 0.7997645 8.658573e-07 Shapiro-Wilk normality test Petal.Width
2: versicolor 0.9476263 2.727780e-02 Shapiro-Wilk normality test Petal.Width
3: virginica 0.9597715 8.695419e-02 Shapiro-Wilk normality test Petal.Width