【问题标题】:Use elements of list to index/subset other list in R使用列表的元素来索引/子集 R 中的其他列表
【发布时间】:2018-01-17 18:20:24
【问题描述】:

是否可以在没有循环的情况下运行以下代码(最好是 lapply 之类的)?

vec1=c(.1,.2,.3,.4,.5)
vec2=c(2,4,6,8,10)

vec3<-c(1,5)
vec4<-c(2,4)

lijst<-list(vec1,vec2)
lijst2<-list(vec3,vec4)

for (i in 1:2) { 
print(lijst[[i]][lijst2[[i]]])
}

这是一个更大的算法的一部分,我需要对其进行优化以减少计算时间。

** 编辑 **

最后我想把lijst2中指示的元素设置为零,所以最终的解决方案应该是如下列表:

[[1]]
[1] 0 0.2 0.3 0.4 0

[[2]]
[1]  2  0  6  0 10

【问题讨论】:

  • lapply(1:2, function(i) print(lijst[[i]][lijst2[[i]]]))
  • 您是否需要出于其他原因将向量放入列表中?否则,您只需运行 vec1[vec3]vec2[vec4] 即可获得相同的结果。
  • 感谢你们的快速回复,我编辑了我的原始帖子以表明我的最终目标是什么。

标签: r list indexing


【解决方案1】:

这应该会给出预期的输出:

mapply(function(x,y) {x[y]=0;x},x=lijst,y=lijst2,SIMPLIFY=FALSE)

输出:

[[1]]
[1] 0.0 0.2 0.3 0.4 0.0

[[2]]
[1]  2  0  6  0 10

【讨论】:

  • 谢谢,但我需要从列表开始。 vec 语句只是为了提供可重现的代码。正如我所提到的,这是一个更大算法的一部分,如果它被设置为一个列表。
  • 对不起,我不明白。您可以使用 mapply 来实现,请参阅我更新的答案。希望这会有所帮助!
  • 我猜一个更标准的方式是Map(replace, lijst, lijst2, 0)
  • 这看起来确实简单多了。还不是很熟悉 mapply/Map 函数..
猜你喜欢
  • 2019-08-13
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 2020-06-09
相关资源
最近更新 更多