【问题标题】:Segmenting and applying a function to a single list分割函数并将其应用于单个列表
【发布时间】:2021-09-20 01:48:12
【问题描述】:

我有一个元素列表,我想对每个元素应用一个函数(例如,mean)。

例如: 对于第一组,我想得到1和1中的mean,然后是1和'2','1'和'3'。

然后是2 和1,然后是2 和“2”,最后是“2”和“3”。

最后是3 和1,然后是3 和“2”,最后是“3”和“3”

对于第二组,我想获得4和4的mean,然后是4和5,4和6

然后是5 和4,然后是5 和5、5 和6。

最后是6 和4,然后是6 和5、6 和6。

我希望最终输出是两个矩阵的列表,其中每个矩阵代表来自l1 的三个元素的集合。我怎样才能得到这个输出?

l1 <- list(1,2,3,4,5,6)

l2 <- list(7,8,9,10,11,12)

Map(
    function(x, y) outer(unlist(x), unlist(y), `+`) / 2,
    split(l1, ceiling(seq_along(l1) / 3)),
    split(l2, ceiling(seq_along(l2) / 3))
)

与代码的输出类似,但只有一个列表,而不是两个。

【问题讨论】:

  • 我使用的示例数据在对象l1中。这就是您所说的输入数据吗?
  • 你需要apply(expand.grid(l1, l1), 1, function(x) mean(unlist(x)))

标签: r list matrix tidyverse


【解决方案1】:

我们可能会为此使用outer

out <- outer(l1, l1, FUN = Vectorize(function(x, y) mean(c(x[[1]], y[[1]]))))

-输出

out
      [,1] [,2] [,3] [,4] [,5] [,6]
[1,]  1.0  1.5  2.0  2.5  3.0  3.5
[2,]  1.5  2.0  2.5  3.0  3.5  4.0
[3,]  2.0  2.5  3.0  3.5  4.0  4.5
[4,]  2.5  3.0  3.5  4.0  4.5  5.0
[5,]  3.0  3.5  4.0  4.5  5.0  5.5
[6,]  3.5  4.0  4.5  5.0  5.5  6.0

根据 OP 帖子中更新的代码,我们可以先将 split 和 list 分成两部分,用 lapply 循环 list 并像第一个代码块一样执行 outer

lapply(split(l1, ceiling(seq_along(l1) / 3)),
  function(subl1) outer(subl1, subl1, 
      FUN = Vectorize(function(x, y) mean(c(x[[1]], y[[1]])))))
$`1`
     [,1] [,2] [,3]
[1,]  1.0  1.5  2.0
[2,]  1.5  2.0  2.5
[3,]  2.0  2.5  3.0

$`2`
     [,1] [,2] [,3]
[1,]  4.0  4.5  5.0
[2,]  4.5  5.0  5.5
[3,]  5.0  5.5  6.0

【讨论】:

  • 如何分离矩阵以获得两个 3x3 矩阵?其中第一组以1 - 3 作为列名和行名,第二组以4-6 作为列名和行名?
  • @JohnHuang 你需要更新中的那个吗
  • 这与我要找的很接近。我编辑了我的帖子,包括有关如何分隔涉及两个列表的列表的代码,但我不确定如何为单个列表执行此操作。我编辑的代码的输出是我正在寻找的,但不是使用两个列表,而是我想要一个列表。
  • 您要查找的输出的尺寸是多少
  • 尺寸为 3x3,因此基本上每个矩阵列表中的三个元素
猜你喜欢
  • 1970-01-01
  • 2020-05-30
  • 2021-09-17
  • 2013-01-27
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多