【问题标题】:R nested for-loop only producing result with last column in dataframeR嵌套的for循环仅产生数据框中最后一列的结果
【发布时间】:2025-11-29 08:25:01
【问题描述】:

上下文:

  • 我正在处理受访者级别的调查数据。我的每一行 数据框代表个人的调查回复。
  • 我的数据框由来自最大差异实验的个体级效用估计值和 分类变量,指示个别调查受访者属于几个子组中的哪一个 居住。
  • 每个子组变量都是具有两个级别的单个分类变量。然而,在我的 所需的输出,我想要一个数据框,其中每个子组的每个级别都有自己的列。

目标:

  • 我想创建一个函数,对每个用户定义的子组进行递归 T 测试 数据框中的每个最大差异项,提取 T 检验输出的元素,并存储 数据框中的元素

  • 以T统计结果为例,最终结果应该是这样的:

         Males_T_stat     Females_T_stat
MD_item1      2.71              2.5
MD_item2      1.71              1.5
MD_item3      0.71              0.5

当前代码:

  • 现在,我专注于编写代码以迭代地执行 T 测试并存储每个测试的全部内容 列表中的输出对象。我曾经尝试过的代码如下:

创建一个测试数据框:

dat <- data.frame(
  md1 = 1:60, 
  gender = factor(rep(c("m", "f"), 30)), 
  generation = factor(rep(c("a", "b"), 30)),
  md2 = 61:120
)

指定我的受访者子组的名称(即分类变量)。

groupnames <- c("gender", "generation")

item_vec <- dat %>% select(contains(("md")))
group_vec <- dat[groupnames]

将子组名称向量转换为数据框。这一步可能是多余的,但我更喜欢使用数据框。

item_vec <- data.frame(item_vec)
group_vec <- data.frame(group_vec)

到目前为止,我已经尝试使用嵌套的 for 循环来运行 T 测试并将每个测试输出存储在一个列表中。此代码部分有效;对于“group_vec”中命名的每个子组,代码只为“item_vec”中的最后一项生成 T 检验结果。但是,我想要“item_vec”中每个项目的结果,这是我目前停滞的地方。

res <- list()

   for (i in 1:length(group_vec)) {
     res[[i]] <- list(test)
      for (j in 1:length(item_vec)) {
        test <- (t.test(item_vec[[j]] ~ group_vec[[i]])) 
        res[i] <- list(test)
      }
   }

 res

提前感谢您提供的任何帮助!

【问题讨论】:

    标签: r loops dplyr nested iteration


    【解决方案1】:

    在嵌套循环中,替换

    res[i] <- list(test)
    

    res[[i]][[j]] <- list(test)
    

    因为“j”在item_vec 上循环。如果我们只是将它分配给res[[i]]res[i],对于'group_vec' 中的每个item_vec,它只会用下一个更新/替换前一个,因为在最后一个之后没有任何更新,最后一个仍然存在对于每个“group_vec”


    另外,最好将res初始化为

    res <- vector('list', length(group_vec))
    

    然后按照for 循环进行更改

    for (i in 1:length(group_vec)) {
         res[[i]] <- list(test)
          for (j in 1:length(item_vec)) {
            test <- (t.test(item_vec[[j]] ~ group_vec[[i]])) 
            res[[i]][[j]] <- list(test)
          }
       }
    

    【讨论】: