【问题标题】:Apply a function to segments of a list将函数应用于列表的各个部分
【发布时间】:2021-09-17 11:07:38
【问题描述】:

我有两个列表,我想从中找到不同元素组合之间的平均值。我想找到列表之间前 3 个元素的平均值,如下所示。然后我想找到列表之间接下来 3 个元素的平均值。

例如: 我想在l1 的第一组元素上应用mean 函数。在这里,我想找到:l1[[1]]l2[[1]] 之间的平均值, l1[[1]]l2[[2]],l1[[1]]l2[[3]]

然后是l1[[2]]l2[[1]]l1[[2]]l2[[2]]l1[[2]]l2[[3]]

最后是l1[[3]]l2[[1]]l1[[3]]l2[[2]]l1[[3]]l2[[3]]

接下来是三对: l1[[4]]l2[[4]]l1[[4]]l2[[2]]l1[[5]]l2[[6]]

然后是l1[[5]]l2[[4]]l1[[5]]l2[[5]]l1[[5]]l2[[6]]

最后是l1[[6]]l2[[4]]l1[6]]l2[[5]]l1[[6]]l2[[6]]

l1 <- list(1,2,3,4,5,6)
l2 <- list(7,8,9,10,11,12)

mean(l1[[1]], l2[[1]])
mean(l1[[1]], l2[[2]])
mean(l1[[1]],l2[[3]])

mean(l1[[2]], l2[[1]])
mean(l1[[2]], l2[[2]])
mean(l1[[2]],l2[[3]])

mean(l1[[3]], l2[[1]])
mean(l1[[3]], l2[[2]])
mean(l1[[3]],l2[[3]])


mean(l1[[4]], l2[[4]])
mean(l1[[4]], l2[[5]])
mean(l1[[4]],l2[[6]])

mean(l1[[5]], l2[[4]])
mean(l1[[5]], l2[[5]])
mean(l1[[5]],l2[[6]])

mean(l1[[6]], l2[[4]])
mean(l1[[6]], l2[[5]])
mean(l1[[6]],l2[[6]])

在我的实际列表中,我在每个列表中都有大量元素,因此首选更自主的方法。

【问题讨论】:

    标签: r list for-loop tidyverse


    【解决方案1】:

    我想你可以试试Map,如下所示

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

    给了

    $`1`
         [,1] [,2] [,3]
    [1,]  4.0  4.5  5.0
    [2,]  4.5  5.0  5.5
    [3,]  5.0  5.5  6.0
    
    $`2`
         [,1] [,2] [,3]
    [1,]  7.0  7.5  8.0
    [2,]  7.5  8.0  8.5
    [3,]  8.0  8.5  9.0
    

    【讨论】:

    • 你认为你能指导我如何修改它以适应我的实际列表吗? xy 是两个拆分吗? outer 函数中的+ 是什么意思?
    • @JohnHuang xy 对应于 l1l2 的拆分,+ 表示 outer 中的输入总和
    • 如果我的列表包含 raster 对象,并且我想使用函数来获得与本示例中创建的矩阵类似的结果,我是否只需将 + 更改为所需的函数?最好的方法是什么?
    • @JohnHuang 对不起,我不熟悉raster
    • @JohnHuang 如果你在outer 中有FUN = 的特定功能,你可以试试outer(unlist(x), unlist(y), FUN = Vectorize(function(p,q) {....})) 之类的东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2013-09-30
    • 1970-01-01
    • 2020-07-07
    相关资源
    最近更新 更多