运行函数的优雅方法,每个因子对data.table

时间:2015-10-23 11:20:54

标签: r data.table

我找到了一种在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是否被错误地执行了?还有另一种方法可以更好地实现这一目标吗?

1 个答案:

答案 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