如何在R中创建循环并返回多个对象

时间:2015-11-24 19:03:06

标签: r loops

这是我的第一篇文章,我认为我已经彻底查看了我的答案而没有运气,但我可能没有输入正确的搜索条件,因为我对R来说相对较新。如果已经回答,我道歉之前和如果有链接将非常感激。

本质上,我试图创建一个循环,它将对我使用read.table从.txt文件读入R的一组数据帧进行操作。我正在使用按站点矩阵组织成许多物种的模拟植被数据,所以如果我能够创建循环,只使用我已经使用的一些函数操作我读过的对象,然后放出新对象,这对我来说是最好的。使用特定的命名模式进入我的工作区(例如,在创建新对象时操作对象名称的末尾放置" _av")。

为了方便起见,假设我只有四个我想要使用的矩阵,所有这些都包含短语" mod"对于模型。我已经读过,我可以通过以下代码将这些数据帧放入数据帧列表中:

    list.mods=lapply(ls(pattern="mod"),get)

这会创建一个列表,我一直无法让我的功能实际运行。根据我的阅读,这是制作您想要操作的对象列表的最佳方法。

让我们说list.mods现在是我的可操作矩阵列表 - mod1,mod2,mod3和mod4。另外,假设我有一个简单计算Bray-Curtis相异度的函数如下:

    bc=function(x){
    vegdist(x,method="bray")
    }

我可以输入:

来使用它
    mod1.bc=bc(mod1)

有效。但似乎我应该能够将我的模型列表应用到函数bc并让它输出模式mod1.bc,mod2.bc,mod3.bc和mod4.bc.我无法让我的文件列表在函数中工作,更不用说将每个操作保存为带有图案名称的新对象。

我做错了什么?最后,我可能有多达一百个或更多的模型,并且非常希望能够创建一个可以通过循环运行的项目列表。

提前致谢。

2 个答案:

答案 0 :(得分:2)

您可以再次使用lapply

new.list.mods <- lapply(list.mods, bc)

这将返回一个新列表,其中每个元素都是将bc应用于list.mods的相应元素的结果。

R中的'apply'系列函数基本上允许您保存输入。如果您更容易理解,则可以使用“for循环”代替。当然,您需要知道如何访问列表中的元素。有question about that

答案 1 :(得分:0)

如何将所需模型/对象的名称收集到列表中:

mod_list <- sapply(ls(pattern = "mod"), as.name)

然后使用您的函数循环遍历它们:

output_list <- lapply(eval(mod_list), bc)

使用此方法可以避免在示例中创建可能较大且冗余的list.mods对象。此外,我认为这将导致方便命名的列表。