R - ddplyr 未按预期工作 - shapiro.test 按类别分类的长格式数据

R - ddplyr not working as expected - shapiro.test on long-form data by categories

我有一个长格式的数据集,“值”列中的值和“ind”中的类别。数据如下所示:

        values  ind
1   42.58666667 le_mean
2   52.35666667 le_mean
64  78.7    le_mean
65  95.49666667 le_mean
66  88.91   le_mean
67  1.295234856 le_sd
68  4.294139417 le_sd
69  0   le_sd
70  7.327416552 le_sd
71  4.007322464 le_sd
72  0   le_sd
73  0   le_sd
74  0   le_sd
75  0   le_sd
76  0.704367328 le_sd
77  1.11    le_sd
78  6.870315374 le_sd
79  10.36559855 le_sd
80  7.589591557 le_sd
86  1.223165293 le_sd
87  7.600019737 le_sd
88  3.655995077 le_sd
89  5.148595278 le_sd
90  0   le_sd
229 2.385211381 re_sd
230 4.465672775 re_sd
231 3.129765699 re_sd
232 3.55056803  re_sd
233 0   re_sd
234 0   re_sd
276 29.34   lf_mean
277 41.66333333 lf_mean
278 39.84666667 lf_mean
279 35.33666667 lf_mean
280 61.68   lf_mean
281 73.22333333 lf_mean
282 75.51666667 lf_mean
283 31.74666667 lf_mean
284 28.37666667 lf_mean
285 40.03333333 lf_mean
286 21.31333333 lf_mean
287 18.90666667 lf_mean
288 0           lf_mean

我试图在数据框中按类别获取 shapiro.test 的 p 值,但我得到的是相同的 p 值,这是不正确的。我试过:

ddply(bpdata_long, .(ind), 
  function(x) shapiro.test(bpdata_long$values)$p.value)

我也试过了:

  shapfunc <- function(x){
  return(data.frame(pvalues=shapiro.test(bpdata_long$values)$p.value))
}
ddply(bpdata_long, .(ind), shapfunc)

但是我得到的结果是:

ddply(bpdata_long, .(ind), 
+       function(x) shapiro.test(bpdata_long$values)$p.value)
       ind                                      V1
1  le_mean 0.0000000000000000000000000000008028749
2    le_sd 0.0000000000000000000000000000008028749
3  re_mean 0.0000000000000000000000000000008028749
4    re_sd 0.0000000000000000000000000000008028749
5  lf_mean 0.0000000000000000000000000000008028749
6    lf_sd 0.0000000000000000000000000000008028749

有人可以帮忙吗?我的代码哪里出错了?

问题是,通过使用 shapiro.test(bpdata_long$values),您在未分组的 values 列上应用了 Shapiro 检验。这就是为什么您为每个组获得相同的值。此外,我建议不要使用已退役的 plyr 包,而是改用 dplyr:

library(dplyr)

bpdata_long %>% 
  group_by(ind) %>% 
  summarise(p.value = shapiro.test(values)$p.value)
#> # A tibble: 4 × 2
#>   ind     p.value
#>   <chr>     <dbl>
#> 1 le_mean 0.450  
#> 2 le_sd   0.00774
#> 3 lf_mean 0.471  
#> 4 re_sd   0.285