繁体   English   中英

创建具有从嵌套 for 循环生成的唯一组合的数据框

[英]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调用中使用ij ,因此所有嵌套for循环迭代都将返回在整个数据帧上运行的完全相同的结果。 快速修复:按第 i 个和第 j 个值subset数据帧。

     anova(value ~ Sub, data = subset(data1, Feature == i & ID == j))
  • 您仅在j值而不是ij下保存列表元素,因此迭代将重复重新分配并且仅保存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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM