我正在努力使用数据框。
我正在计算n个参与者的测试结果,每个参与者都有m个结果。这将在嵌套for循环中完成:n x m。 所以首先For-Loop进入第一个Proband。第二个for循环计算测试值。 1个先证者的1次测试的测试结果从函数返回。
我很难用数据框和向量设置它,因为我对R来说是全新的。
伪代码:
final_results[][]
for (each folder in path) {
proband_results[]
for (each file in folder) {
test_result <- someFunction(file)
proband_results.append(test_result)
}
final_results.append(proband_results)
}
答案 0 :(得分:2)
正如Circle 2 of the R Inferno: Growing Objects中所建议的那样,不要使用cbind
,rbind
,append
和{{}在循环中扩展特别大的对象,如矩阵/数组和数据框1}}运算符会导致内存中的过多复制。
相反,构建对象列表,然后在迭代之外的一个调用中绑定。或者,初始化一个大的空容器,并按容器索引迭代分配值而不附加。
对于前者,可以使用R的 apply 系列循环来促进该方法,该循环已知输出具有相等长度的对象。对于嵌套在较大c
子文件夹中的文件,下面运行sapply
。 假设某个函数接收一个参数为文件名并返回一个向量。
lapply
答案 1 :(得分:1)
根据您的代码有R版本。使用NULL
初始化并使用cbind
和rbind
。我假设test_result
已经是data.frame类型。
final_results= NULL
for (each folder in path) {
proband_results = NULL
for (each file in folder) {
test_result <- someFunction(file)
proband_results = cbind(proband_results,test_result) # column bind
}
final_results = rbind(final_results,proband_results) # row bind
}
然而,这并不是R结合结果的有效方法。因为,例如,在这里你要调用rbind
n次,每次调用不断增长的final_results(增长内存)并使用rbind
。矢量化方式是(小改进)使用list
结构(链表):
final_results= NULL
i = 1
for (each folder in path) {
proband_results = NULL
for (each file in folder) {
test_result <- someFunction(file)
proband_results = cbind(proband_results,test_result) # column bind
}
final_results[[i]] = proband_results # A list that link all proband results
i = i + 1
}
res = do.call("rbind",final_results) # rbind for all the element in the list
这个版本一次性rbind
。