【问题标题】:What is the best way to apply a function between two named lists in R?在 R 中的两个命名列表之间应用函数的最佳方法是什么?
【发布时间】:2021-05-08 16:34:01
【问题描述】:

我有一个结构如下的 S3 对象:

dataset <- NULL
dataset$x <- list(a=runif(10), b=runif(10), c=runif(10))
dataset$y <- list(a=runif(10), b=runif(10), c=runif(10))

两个列表 $x 和 $y 包含相同数量的同名元素。

我需要同时在两个列表之间应用一个函数,如下:

for(i in c('a','b','c')){
  subset <- dataset$x[[i]] > 0.5
  dataset$x[[i]] <- subset(dataset$x[[i]], subset)
  dataset$y[[i]] <- subset(dataset$y[[i]], subset)
}

在实际情况下,列表具有非常多的元素,因此循环不是最快的方法。对这个循环进行矢量化的最佳方法是什么?

谢谢!

【问题讨论】:

  • 如果您想就地修改这两个列表,那么for 循环确实是最好(最清晰)的方法。至于“最快的方法”,通常for 循环与lapply 和类似的一样快(很多年前,这不是真的),因此两者都有明显的优势。

标签: r list vectorization named


【解决方案1】:

这是lapply/Map 的一种方法。从“数据集”中提取“x”元素,将双 list 元素转换为 logical(“lst1”)。然后使用lapply 遍历“数据集”,使用Map 内部到subset 内部list 以及使用“x”元素(“lst1”)创建的逻辑list

lst1 <- lapply(dataset$x,`>`, 0.5)
out <- lapply(dataset, function(x) Map(subset, x, lst1))

优点是我们不必像 OP 的帖子中那样提取多个 list 元素

-输出

out
$x
$x$a
[1] 0.6849740 0.7275233 0.8227778 0.9315966

$x$b
[1] 0.6296180 0.5122322 0.6795041

$x$c
[1] 0.5528317 0.9408803 0.7244978 0.6040235 0.8212669 0.5369701


$y
$y$a
[1] 0.1836949 0.8954276 0.5996935 0.4948389

$y$b
[1] 0.2699243 0.5965194 0.3989432

$y$c
[1] 0.5072449 0.1735438 0.4563791 0.9464107 0.7269070 0.4369199

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    相关资源
    最近更新 更多