如何对数据集进行for循环和t检验?

时间:2019-04-18 09:11:41

标签: r dataframe for-loop statistics

我试图将for循环应用于R中的数据框,使用它获取行号(将在t检验中使用)以及指定的列索引。 当我运行当前拥有的代码时,它仅采用for循环中指定的最后一个值。 我该如何解决?(对不起,我是一个完整的新手)

这是我的代码:
x代表数据集

for(i in 1:nrow(x)){
    test<- t.test(x[i, 1:5], x[i, 6:10])
    return(test$p.value)
  }

我希望它使用i(作为行号)和指定的列索引作为输入在每行上进行t检验,以便为我提供每次测试的p值

2 个答案:

答案 0 :(得分:0)

发生这种情况是因为您一直都覆盖test。如果您确实要为此使用for循环并随后提取p值,则效果更好:

set.seed(1)
x <- matrix(sample(1:100,100), nrow = 10)

test = list()
a = 0

for(i in 1:nrow(x)){
  a <- a + 1
  test[[a]] <- t.test(x[i, 1:5], x[i, 6:10])
}

lapply(test, "[[", "p.value")

但是,在这种情况下,更优选使用apply纳迪赞提出的方法。

答案 1 :(得分:0)

我认为,要使用return,您必须定义一个函数(实际上我很惊讶您没有收到错误)。发生的是,循环根据需要执行了所有测试,但是将它们覆盖在同一变量test上,因此最后只有最后一个结果。

编辑:实际上,我检查了一下,return应该让您在第一次迭代时退出,从而仅获得第一次测试的结果。

解决此问题的一种简单方法是创建一个向量,然后将每个新结果附加到与对应行相同的位置:

test <- c()
for(i in 1:nrow(x)){
    test[i] <- t.test(x[i, 1:5], x[i, 6:10])
}

请注意,随着空向量/列表的最终长度增加,将其追加非常昂贵,因此您可能需要使用长度与数据帧的行数相同的NA对其进行初始化:

test <- rep (NA,nrow(x))