r - 使用 for 循环在 R 中使用 manova?
问题描述
anova_test <- function(dataSet, dataOne, dataTwo){
for (j in 1:8){
for (i in 1:4){
for (k in i:4){
if(i!=k){
res <- manova(cbind(colnames(dataOne)[i], colnames(dataOne)[k]) ~ colnames(dataTwo)[j], data = dataSet)
summary(res.man)
# Look to see which differ
summary.aov(res.man)
}
}
}
}
}
D <- apply_impute(data)
dataOne <- select(D, age, child, balance, previous)
dataTwo <- select(D, job, marital, education, default, housing, loan,
contact, month)
anova_test(D, dataOne, dataTwo)
这是我的代码。D 是一个数据集。在 dataOne 中,我放置了 D 的定量变量,在 dataTwo 中,我放置了 D 的分类变量。我想遍历 D 以将 manova 与每对定量变量和每个分类变量一起使用。
但是当我运行它时,我收到以下错误:
Error in `[[<-.data.frame`(`*tmp*`, i, value = 1:2) :
replacement has 2 rows, data has 1
De plus : Warning message:
In storage.mode(v) <- "double" :
Error in `[[<-.data.frame`(`*tmp*`, i, value = 1:2) :
replacement has 2 rows, data has 1
你能帮我找出我的代码有什么问题吗?
解决方案
考虑捕获两组列名的所有可能组合,然后使用(wrapper to )expand.grid
调用一个元素循环,而不是不将结果保存到任何对象的三级嵌套循环。Map
mapply
for
# BUILD DATA FRAME OF ALL POSSIBLE COMBINATIONS
params_df <- expand.grid(cat1 = c("age", "child", "balance", "previous"),
cat2 = c("age", "child", "balance", "previous"),
quant = c("job", "marital", "education", "default",
"housing", "loan", "contact", "month"))
# REMOVE ROWS WHERE CATEGORIES ARE THE SAME
params_df <- subset(params_df, cat1 != cat2)
# USER-DEFINED METHOD TO CALL manova WITH DYNAMIC FORMULA AND RESULTS
anova_test <- function(dataSet, cat1, cat2, quant) {
frml <- as.formula(paste0("cbind(", cat1, ",", cat2, ") ~ ", quant))
res.man <- manova(frml, data = dataSet)
res.list <- list(estimates = summary(res.man),
aov = summary.aov(res.man))
return(res.list)
}
# RETREIVE DATA
D <- apply_impute(data)
# BUILD LIST OF MANOVA RESULTS
manova_list <- Map(anova_test,
cat1 = params_df$cat1,
cat2 = params_df$cat2,
quant = params_df$quant,
MoreArgs = list(dataSet = D))
输出
# DISPLAY SELECT RESULTS BY INDEX AND NAMES
manova_list[[1]]$estimates
manova_list[[1]]$aov
manova_list[[2]]$estimates
manova_list[[2]]$aov
# ...
# DISPLAY ALL RESULTS
lapply(manova_list, `[[`, "estimates")
lapply(manova_list, `[[`, "aov")
推荐阅读
- apache-spark - Spark 使用自定义函数聚合行
- python - 当我尝试在 bash 中运行 python 命令时遇到问题
- r - 将列名传递给 mutate_at 中的用户定义函数
- python - pycharm 查找同名函数
- android - 如何在 android studio 上安装 Cmake 3.4.1
- excel - 使用 Indirect() 创建数组
- php - 与 OS X 上的 MAMP 不同的控制台 php 版本
- java - 将 C++ 结构映射到 Java 结构
- php - 当出现致命异常错误时,PHPUnit 显示测试已通过
- f# - 实体框架核心:将转换应用于选项类型的所有属性
在 F#