【问题标题】:Reduce number of elements returned by lapply [closed]减少 lapply 返回的元素数量 [关闭]
【发布时间】:2017-11-30 12:47:28
【问题描述】:

正如?lapply 所说:

lapply 返回一个与 X 长度相同的列表,其中每个元素 是对X的对应元素应用FUN的结果。

是否仍然可以返回长度小于 X 的列表?

代码

l <- lapply(1:10,function(u)ifelse(u<5,return(u),return(NULL)))

我可以在 return(NULL) 部分放置一些东西以完全删除/省略元素吗?

所需的输出

代码部分的输出应与以下内容相同:

l[!sapply(l,is.null)]

4 个列表,只有小于 5 的元素!

【问题讨论】:

  • 可以从tidyverse中查看purrr包,特别是compact函数
  • 你引用的描述不是很清楚地回答了你的问题吗?
  • lapply 将始终返回与输入长度相同的结果,但您可以使用 Filter(Negate(is.null), lapply(...)) 返回非空结果。
  • 你也可以Filter(length, lapply(1:10,function(u)ifelse(u&lt;5,return(u),return(NULL))))
  • 投票结束,因为问题不是“如何在 lapply 之后删除 NULL?” (那么这是重复的)但是“是否可以从输入长度 within lapply 返回较小长度的输出?” (来自手册:它说不)

标签: r list lapply


【解决方案1】:

是否仍然可以返回长度小于 X 的列表?

根据 OP 引用的文档,答案是“不,除非您将 lapply 包装在另一个调用中,该调用在它之前或之后过滤掉不需要的元素。”


有很多可能的解决方法,但我可能会这样做......

# example function
f = function(z) c(a = list(z+1), b = list(z-1), c = if (z > 3) list(z^2))

library(data.table)
data.table(x = 1:10)[x < 5, rbindlist(lapply(x, f), fill=TRUE)]

   a b  c
1: 2 0 NA
2: 3 1 NA
3: 4 2 NA
4: 5 3 16

... 假设函数返回一个命名列表。如果它只返回一个标量,请尝试矢量化或使用sapplyvapply 而不是lapply

【讨论】:

  • 如果你们都同意手册中的声明不包括此类所需的输出,我可能会问一个愚蠢的问题;-)。但是对于有相同想法的人来说,这个问题可能是一个很好的参考。最好的问候。
猜你喜欢
  • 2022-08-15
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
相关资源
最近更新 更多