我试图将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值
答案 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))