【问题标题】:How to delete list elements in a loop如何在循环中删除列表元素
【发布时间】:2017-11-02 10:59:25
【问题描述】:

我正在尝试在for-loop 中创建一个列表,每个步骤都会更新i=1:200

就我而言,在每个步骤i 我都需要列表元素i+1i+2,仅此而已。

我最终会得到一个长度为 202 的列表,我希望这会大大减慢我的计算速度(目前 200 步大约需要 1 小时)。

为了缩短列表,我想删除我不需要的每个列表元素i(即所有 i=i)。

不幸的是,我尝试使用简单地删除 for-loop 中的列表元素 mylist[[i]]<-NULLmylist<-mylist[-i]。两者都可以在循环外正常工作,但不能在循环内工作。这里是一个简单的例子:

mylist<-list()
for (i in 1:3){
  mylist[[i+1]]<-c(1:10)*i
  mylist[[i]]<-NULL}
mylist

mylist<-list()
for (i in 1:3){
  mylist[[i+1]]<-c(1:10)*i
  mylist<-mylist[-i]}
mylist
mylist[[i]]<-NULL
mylist<-mylist[-i] 

【问题讨论】:

  • “就我而言,在每个步骤 i 中,我都需要列表元素 i+1 和 i+2”,但是您从一个空列表开始?您需要未来的元素,还是过去只需要两次迭代?我不明白您的示例如何与描述匹配。你能只维护一个长度为 2 的列表吗?预期的输出是什么?
  • 那么您感兴趣的主要输出只是列表的最后一个元素?
  • @Axeman:感谢您的回复。该示例是一个非常简化的版本来显示问题。在我的例子中,我从 i=1 开始,创建 mylist[[i]],用于确定 mylist[[i+1]] 和 mylist[[i+2]](均在步骤 i 中创建)。我需要在下一步 (i+1) 中使用 mylist[[i+1]],在步骤 i+2 中使用 mylist[[i+2]]。但是,每一步我都需要更新 mylist[[i]]、mylist[[i+1]] 和 mylist[[i+2]],但同时需要前两步的列表。输出是具有不同行和 4 列的矩阵或 data.frame。不确定这是否可行。可能要多虑了。谢谢。
  • @tobiasegli_te:感谢您的回复。我需要在每个步骤 i 中创建的列表的最后两个元素,它们在步骤 i+1 和 i+2 中实现。

标签: r list for-loop


【解决方案1】:

设置为NA 对你有用吗?

mylist<-list()
for (i in 1:100){
  mylist[[i+1]]<-c(1:10)*i
  mylist[[i+2]]<-c(11:20)*i
  mylist[[i]] <- NA
}
mylist
# [[1]]
# [1] NA
# ...
# [[100]]
# [1] NA
#
# [[101]]
# [1]  100  200  300  400  500  600  700  800  900 1000
#
# [[102]]
# [1] 1100 1200 1300 1400 1500 1600 1700 1800 1900 2000

【讨论】:

  • 感谢您的回答。它确实有助于在一定程度上减少 mylist 的大小。我会试一试的。
  • 要摆脱 NA,只需执行 mylist[!is.na(mylist)]
  • 好建议,但似乎在循环中不起作用。但是设置 mylist[[i]]
  • 您必须在循环完成后移除 NA。使用数组还是列表取决于您在做什么以及每次迭代的结果是什么,但它不应该影响速度(200 次迭代)。也许你可以优化你在每次迭代中所做的一切以加快循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 2012-05-26
相关资源
最近更新 更多