Kruskal Wallis测试:创建lappy函数来子集data.frame?
我有一个值的数据集,按多个类别(距离和相位)分组。我想用Kruskal-Wallis测试对每个类别进行测试,其中val是因变量,距离是一个因子,将我的数据分为3组 因此,我需要在Kruskal-Wallis测试中指定数据子集,然后将测试应用于每个组。但是,我不能让我的子集工作 在R帮助中,指定子集为可选向量,指定要使用的观测子集。但是如何正确地把它放到lappy函数中呢 我的虚拟数据: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
# 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的输出也很棒。谢谢你晚来帮忙。