我有一个数据框,其中包含5列,每列对应一个调查项目,以及一个分组变量。我的数据框中总共有300个观察值,每个单元格条目代表学生在给定项目上给出的响应。我构造了以下可重现的数据框:
set.seed(14)
Group <- rep(c(0, 1), each = 150)
mydf <- data.frame(replicate(5, sample(0:1,300,rep=TRUE)))
mydf$Group <- Group
mydf$Group <- factor(mydf$Group, levels = c(0, 1), labels = c("Group A", "Group B"))
head(mydf); tail(mydf)
> head(mydf); tail(mydf)
X1 X2 X3 X4 X5 Group
1 0 1 1 1 0 Group A
2 1 1 1 1 1 Group A
3 1 1 0 1 0 Group A
4 1 0 0 1 1 Group A
5 1 1 0 1 0 Group A
6 1 0 1 1 1 Group A
X1 X2 X3 X4 X5 Group
295 0 1 1 0 1 Group B
296 0 0 1 0 0 Group B
297 1 1 0 1 0 Group B
298 1 1 0 0 1 Group B
299 0 0 1 0 0 Group B
300 1 1 1 1 1 Group B
我想做的是对每个调查项目进行卡方独立性检验X1
至X5
。到目前为止,我一直在进行以下[对于项目1(X1
)]:
mydf$X1 <- factor(mydf$X1, levels = c(0, 1), labels = c("AGREE", "DISAGREE"))
MyTable <- table(mydf$Group, mydf$X1)
addmargins(MyTable)
chisq.test(MyTable, correct = FALSE)
并且我想使用lapply
函数(或类似的东西)来自动执行此过程,因此我不必为5个项目中的每一个重复前面的代码。这一点特别重要,因为我有一个类似的数据框,其中包含50个项目,并且我想使用相同的代码来自动化这些分析。关于如何进行的任何建议?我在调出每个变量(例如X1
,X2
等)时遇到了最大的麻烦,但我不确定该怎么做。我最近开始使用R,因此我对这些功能和命令没有足够的了解。任何帮助是极大的赞赏。
我们可以使用lapply
将列“ X1”循环到“ X5”,然后使用“组”列创建一个table
,并创建chisq.test
以返回测试结果list
out <- lapply(mydf[paste0("X", 1:5)], function(x)
chisq.test(table(mydf$Group,
factor(x, levels = 0:1, labels = c("AGREE", "DISAGREE"))),
correct = FALSE))
sapply(out, `[[`, "p.value")
# X1 X2 X3 X4 X5
#0.72875061 0.72888976 0.90732945 0.01525704 0.08243538
这里有一个更好的解决方案,可以使事情井井有条...
library(dplyr)
library(purrr)
library(infer)
# make a simple vector of the variables you want on one side
exexs <- c("X1", "X2", "X3")
# an easy way to keep track of names
names(exexs) <- exexs
# make our own simple function
MyFunction <- function(data, groupvar, var)
{
infer::chisq_test(formula = as.formula(paste(var, "~", groupvar)),
x = data,
correct = FALSE) # you can pass options to chisq.test
}
# purrr::map(exexs, ~ MyFunction(data = mydf, groupvar = .x, var = "Group"))
purrr::map_dfr(exexs, ~ MyFunction(data = mydf, groupvar = .x, var = "Group"), .id = "Variable") %>% rbind()
#> # A tibble: 3 x 4
#> Variable statistic chisq_df p_value
#> <chr> <dbl> <int> <dbl>
#> 1 X1 0.120 1 0.729
#> 2 X2 0.120 1 0.729
#> 3 X3 0.0136 1 0.907
根据您的数据
set.seed(14)
Group <- rep(c(0, 1), each = 150)
mydf <- data.frame(replicate(5, sample(0:1,300,rep=TRUE)))
mydf$Group <- Group
mydf$Group <- factor(mydf$Group, levels = c(0, 1), labels = c("Group A", "Group B"))