如何在R中进行循环

3

我在R语言的循环方面还比较新手。我想要遍历按顺序编号的数据框,以便对它们执行某个操作。

这些数据框名为total,按顺序从1到15编号:

total1
total2
total3

我希望能从循环中简单地找出如何打印这些对象的名称,以便我可以将其用作执行其他操作的起点。目前我所做的只是:
```python for obj in objects: print(obj) ```

etc.

for (n in 1:15)
{print total[n]
}

但是我一直收到错误提示。
Error: object 'total' not found

我做错了什么?我已经创建好了所有的数据框。

1
如果您想打印对象名称 ls(pattern='total\\d+') 或者使用 cat 包装,可以使用以下代码:cat(ls(pattern='total\\d+'), sep="\n") - akrun
1
我想要传达的是,你不需要使用循环。for(n in 1:15) print(paste0('total', n)) - akrun
2
你可以使用mget来返回一个列表。 lst <- mget(ls(pattern='total\\d+')); lapply(lst, transform, newCol=V1*8) - akrun
1
@akrun,你能把它发布为一个答案吗? - Sebastian Zeki
1
你可能会对这个感兴趣:http://blog.datacamp.com/tutorial-on-loops-in-r/ - jangorecki
显示剩余3条评论
3个回答

4

如果我们有多个对象的名称都以模式total开头,后面跟着一些数字,我们可以通过使用ls并指定pattern参数来获取全局环境中的对象名称。使用mget将存储在对象中的值存储在list中。假设我们想要添加一个新列,我们可以使用lapply循环遍历list并使用transform创建一个新列。

 lst <- mget(ls(pattern='total\\d+'))
 lst1 <- lapply(lst, transform, newCol=V1*8)

我建议将数据框保留在list中,而不是更新全局环境中的对象。假设您需要这样做。

 list2env(lst1, envir=.GlobalEnv)

不建议这样做,因为大多数操作都可以在list中完成,包括将其写入新文件或现有文件。此外,最好使用lapply/read.table读取list中的所有文件,而不是在全局环境中创建多个对象。


2
错误信息很准确:没有名为total的对象。相反,您有total1等对象。要解决此问题,请将您的data.frame放入列表中,而不是通过添加索引进行编号:
total = list(
    first_data_frame,
    second_data_frame,
    …
)

我假设您正在从某个来源生成/加载您的data.frame,因此将它们放入列表而不是单独的变量应该很简单。


0
你可以尝试这个:
names <- paste("total", 1:15, sep="")
names[1]
names[15]
names[1:15]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接