R嵌套的for循环,仅在数据帧的最后一列产生结果

问题描述 投票:1回答:1

上下文:

  • 我正在使用受访者级别的调查数据。我的每一行数据框代表一个人的调查回复。
  • 我的数据框由“最大差异”实验中的各个级别的效用估算值组成,并且类别变量,指示单个调查对象属于哪个子组居住。
  • 每个子组变量是具有两个级别的单个类别变量。但是,在我的所需的输出,我想要一个数据框,其中每个子组的每个级别都有其自己的列。

目标:

  • 我想为每个用户定义的子组创建一个函数,该函数将对数据框中的每个最大差异项,提取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个回答
0
投票

在嵌套循环中,替换

res[i] <- list(test)

with

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)
      }
   }
© www.soinside.com 2019 - 2024. All rights reserved.