【问题标题】:How to subset from a long list?如何从长列表中提取子集?
【发布时间】:2012-11-02 18:32:07
【问题描述】:

我有一个列表x,其中包含数百万个条目。我想将所有长度大于一的条目放入一个新列表z。我怎样才能在 R 中有效地做到这一点?

我尝试了这段代码,R 只是一直运行了很长时间。

z=NULL
for(i in 1:length(x)) {
  if(length(x[[i]])!=1) z=list(z,x[[i]])
}

【问题讨论】:

  • 顺便说一句,该代码不起作用(而且速度很慢):您可能是指z=list(),然后是z=c(z, list(x[[i]]))
  • 感谢您指出我的错误!

标签: r list subset


【解决方案1】:

这是你想使用vapply的一种情况:

z <- x[vapply(x, length, integer(1)) > 1L]

以下是比较 sapplyvapply 的基准:

A <- list( x = c(), y = c(1), z = c(1, 2))
B <- A[sample(1:3, 1e7, replace = TRUE)]
system.time(sapply(B, length))
#    user  system elapsed 
#   55.95    0.54   56.50 
system.time(vapply(B, length, integer(1)))
#    user  system elapsed 
#    6.78    0.00    6.78 

【讨论】:

  • 谢谢弗洛德尔!我还有一个问题。比较不同功能的效率应该参考哪个时间?
【解决方案2】:

只要做:

z = x[sapply(x, length) > 1]

【讨论】:

  • 谢谢大卫!这真的为我节省了很多时间!
猜你喜欢
  • 2012-03-26
  • 2020-01-05
  • 1970-01-01
  • 2020-03-06
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多