Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kruskal Wallis测试:创建lappy函数来子集data.frame?_R_Loops - Fatal编程技术网

Kruskal Wallis测试:创建lappy函数来子集data.frame?

Kruskal Wallis测试:创建lappy函数来子集data.frame?,r,loops,R,Loops,我有一个值的数据集,按多个类别(距离和相位)分组。我想用Kruskal-Wallis测试对每个类别进行测试,其中val是因变量,距离是一个因子,将我的数据分为3组 因此,我需要在Kruskal-Wallis测试中指定数据子集,然后将测试应用于每个组。但是,我不能让我的子集工作 在R帮助中,指定子集为可选向量,指定要使用的观测子集。但是如何正确地把它放到lappy函数中呢 我的虚拟数据: # create data val<-runif(60, min = 0, max = 100) dis

我有一个值的数据集,按多个类别(距离和相位)分组。我想用Kruskal-Wallis测试对每个类别进行测试,其中val是因变量,距离是一个因子,将我的数据分为3组

因此,我需要在Kruskal-Wallis测试中指定数据子集,然后将测试应用于每个组。但是,我不能让我的子集工作

在R帮助中,指定子集为可选向量,指定要使用的观测子集。但是如何正确地把它放到lappy函数中呢

我的虚拟数据:

# create data
val<-runif(60, min = 0, max = 100)
distance<-floor(runif(60, min=1, max=3))
phase<-rep(c("a", "b", "c"), 20)

df<-data.frame(val, distance, phase)

# get unique groups
ii<-unique(df$phase)

# get basic statistics per group
aggregate(val ~ distance + phase, df, mean)

# run Kruskal test, specify the subset
kruskal.test(df$val ~df$distance,
             subset = phase == "c")
我的总体目标是从kruskal.test创建一个函数,并将每个组的所有统计数据保存到一个表中


非常感谢您的帮助。

通常您会先拆分,然后再拆分

差不多

lapply(split(df, df$phase), function(d) { kruskal.test(val ~ distance, data=d) })
将生成kruskal.test结果的列表,该列表按阶段索引

您的最终表达式不起作用,因为lapply需要一个函数,而应用kruskal.test不会生成函数,它会生成运行该测试的结果。如果您用一个带索引的函数定义来包围它,那么它就可以工作了,只是不那么惯用

lapply(ii, function(i) { kruskal.test(df$val ~ df$distance, subset=df$phase==i )})

通常,你会先分裂,然后翻滚

差不多

lapply(split(df, df$phase), function(d) { kruskal.test(val ~ distance, data=d) })
将生成kruskal.test结果的列表,该列表按阶段索引

您的最终表达式不起作用,因为lapply需要一个函数,而应用kruskal.test不会生成函数,它会生成运行该测试的结果。如果您用一个带索引的函数定义来包围它,那么它就可以工作了,只是不那么惯用

lapply(ii, function(i) { kruskal.test(df$val ~ df$distance, subset=df$phase==i )})

虽然已经晚了,但它可能会帮助有同样问题的人。因此,我将使用tidyverse和rstatix包实现一个答案。rstatix软件包提供了一个简单直观的管道友好框架,与执行基本统计测试的“tidyverse”设计理念相一致

library(rstatix)
library(tidyverse)

df %>% 
  group_by(phase) %>% 
  kruskal_test(val ~ distance)
输出

# A tibble: 3 x 7
  phase .y.       n statistic    df     p method        
* <chr> <chr> <int>     <dbl> <int> <dbl> <chr>         
1 a     val      20    0.230      1 0.631 Kruskal-Wallis
2 b     val      20    0.0229     1 0.88  Kruskal-Wallis
3 c     val      20    0.322      1 0.570 Kruskal-Wallis

虽然已经晚了,但它可能会帮助有同样问题的人。因此,我将使用tidyverse和rstatix包实现一个答案。rstatix软件包提供了一个简单直观的管道友好框架,与执行基本统计测试的“tidyverse”设计理念相一致

library(rstatix)
library(tidyverse)

df %>% 
  group_by(phase) %>% 
  kruskal_test(val ~ distance)
输出

# A tibble: 3 x 7
  phase .y.       n statistic    df     p method        
* <chr> <chr> <int>     <dbl> <int> <dbl> <chr>         
1 a     val      20    0.230      1 0.631 Kruskal-Wallis
2 b     val      20    0.0229     1 0.88  Kruskal-Wallis
3 c     val      20    0.322      1 0.570 Kruskal-Wallis

令人惊叹的我想我永远也不会明白。。。你帮我省去了很多头痛…:-太可怕了!!我想我永远也不会明白。。。你帮我省去了很多头痛…:-虽然这里的两种解决方案都有效,但您的解决方案实际上非常有用,而且tibble输出非常好。谢谢你的帮助。虽然这里的两个解决方案都是有效的,但你的解决方案确实非常有帮助,tibble的输出也很棒。谢谢你晚来帮忙。