【问题标题】:Applying a function across nested list跨嵌套列表应用函数
【发布时间】:2019-10-18 15:07:10
【问题描述】:

说,我有以下清单

raw <- list(list(1:2, 2:3, 3:4), list(4:5, 5:6, 6:7), list(7:8, 8:9, 9:10))

我想找到最外列表中相应条目的平均值。预期的输出将类似于

[[1]]
[1] 4 5

[[2]]
[1] 5 6

[[3]]
[1] 6 7

这是因为 1:24:57:8 的平均值为 4:5

我一直在尝试lapply(raw, function(x) lapply(x, mean)) 之类的东西,但显然它没有返回所需的输出。

【问题讨论】:

    标签: r list nested apply lapply


    【解决方案1】:

    这很丑陋,但我们可以使用 mapply 来遍历列表,但我们需要通过 do.call 将列表扩展为参数

    do.call("mapply", c(function(...) rowMeans(data.frame(...)), raw, SIMPLIFY=FALSE))
    

    您可以使用purrr 包使这个更漂亮

    purrr::pmap(raw, ~rowMeans(data.frame(...)))
    

    【讨论】:

      【解决方案2】:

      1

      n = length(raw[[1]])
      lapply(1:n, function(i){
          d = do.call(rbind, lapply(seq_along(raw), function(j){
              raw[[j]][[i]]
          }))
          apply(d, 2, mean)
      })
      #[[1]]
      #[1] 4 5
      
      #[[2]]
      #[1] 5 6
      
      #[[3]]
      #[1] 6 7
      

      2

      aggregate(. ~ ind, do.call(rbind, lapply(raw, function(x)
          data.frame(cbind(do.call(rbind, x), ind = seq_along(x))))), mean)
      #  ind V1 V2
      #1   1  4  5
      #2   2  5  6
      #3   3  6  7
      

      【讨论】:

        【解决方案3】:

        你可以把这个东西放到一个数组中,然后取出单元格medians(我想你想要这些而不是means)。

        A <- array(matrix(unlist(raw), 2, byrow=FALSE), dim=c(2, 3, 3))
        v.mds <- t(apply(A, 1:2, median))
        lapply(1:3, function(x) v.mds[x, ])
        #   [[1]]
        # [1] 4 5
        # 
        #   [[2]]
        # [1] 5 6
        # 
        #   [[3]]
        # [1] 6 7
        

        这样概括:

        A <- array(matrix(unlist(raw), length(el(el(raw))), byrow=0), 
                   dim=c(length(el(el(raw))), el(lengths(raw)), length(raw)))
        v.mds <- t(apply(A, 1:2, median))
        lapply(1:nrow(v.mds), function(x) v.means[x, ])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-03
          • 2021-07-12
          • 1970-01-01
          • 2017-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多