[英]Create a data frame with unique combo generated from nested for loops
我有一个这样的数据框:
Feature ID Sub Value
A T1 B1 5.87
B T1 B2 3.99
C T1 B3 12.57
A T1 B2 9.22
B T1 B3 7.89
C T1 B1 4.76
A T2 B1 4.56
B T2 B2 9.26
C T2 B2 7.44
我想要做的是在这个数据集中运行一个因子方差分析,因子为“子”。 我想遍历每个功能并遍历每个 ID。 基本上,我正在计算“Sub”之间的 ID 内每个特征的方差。
我已经生成了下面的代码,但它似乎没有工作。
datalist = list()
for (i in unique(data1$Feature)) {
for (j in unique(data1$ID)) {
A1 <- summary(aov(data1$value ~ as.factor(data1$Sub), data = data1))
datalist[[j]] <- A1
}
}
big_data = do.call(rbind, datalist)
我最终得到了 big_data,它是一个由 36 个列表组成的矩阵。 我无法访问 Anova output。 它不一定是数据框。 即使它是循环中的“write.csv()”,也会产生不同的输出。 最终,我只需要 Anova output 的“中间”因子参数来生成 plot,所以如果这也可以包含在代码中,那将有很大帮助。
我仍然是 R 的初学者,非常感谢任何帮助。
谢谢!
当前设置的几个问题:
您实际上并未在anova
调用中使用i
和j
,因此所有嵌套for
循环迭代都将返回在整个数据帧上运行的完全相同的结果。 快速修复:按第 i 个和第 j 个值subset
数据帧。
anova(value ~ Sub, data = subset(data1, Feature == i & ID == j))
您仅在j
值而不是i
和j
下保存列表元素,因此迭代将重复重新分配并且仅保存j
项的最后一次传递。 快速修复:添加第 i 个和第 j 个值的命名元素。
datalist[[paste0(i, "_", j)]] <- A1
您正在尝试rbind
列表对象,而不是矩阵或数据框,因为summary.anova
返回结果列表。 对于您的用例,调用str
显示您的结果包含 1 的列表:
str(summary(aov(data1$value ~ as.factor(data1$Sub), data = data1))) List of 1 $:Classes 'anova' and 'data.frame': 2 obs. of 5 variables: ..$ Df: num [1:2]... ..$ Sum Sq: num [1:2]... ..$ Mean Sq: num [1:2]... ..$ F value: num [1:2]... ..$ Pr(>F): num [1:2]... - attr(*, "class")= chr [1:2] "summary.aov" "listof"
快速修复:索引第一项。
summary(anova(...))[[1]]
但是,请考虑使用by
(面向对象的包装器tapply
)的应用系列解决方案,并避免初始化列表的簿记并在嵌套for
循环中迭代分配。 具体来说,可以by
一个或多个组拆分数据帧并对子集运行操作以返回一个列表,该列表等于组的所有可能的唯一值。 此外,考虑使用定义的方法来封装每个子集上的所有处理。
# USER-DEFINED METHOD
run_anova <- function(sub_df) {
# RAW RESULTS
anova_raw <- summary(aov(value ~ Sub, data = sub_df))[[1]]
# CLEAN UP DATA WITH IDENTIFIERS
anova_df <- data.frame(
within(anova_raw, {Feature <- sub_df$Feature[1]; ID <- sub_df$ID[1]}),
row.names = NULL,
check.names = FALSE
)
return(anova_df)
}
datalist <- by(data1, data1[c("Feature", "ID")], run_anova)
big_data <- do.call(rbind, unname(datalist))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.