【问题标题】:applying apply() to deeply embeded list elements only仅将 apply() 应用于深度嵌入的列表元素
【发布时间】:2011-02-22 07:22:54
【问题描述】:

我想仅将我的函数应用于列表结构中更深的元素。

例如,我想应用某个函数来仅列出二阶元素。这对 apply() 可行吗?

> str(l)
List of 3
 $ :List of 2
  ..$ : num 5
  ..$ : num 10
 $ :List of 2
  ..$ : num 15
  ..$ : num 20
 $ :List of 2
  ..$ : num 25
  ..$ : num 30

【问题讨论】:

    标签: list r apply


    【解决方案1】:

    不知道“r”,但我相信你可以应用一个应用你的函数的函数。 让你的功能是 f,然后改为 apply f write apply (apply f)

    在haskell-ish中

    data = [[5,10], [15,20], [25,3]]
    

    假设我们要给每个数字加 1:

    map (map (+1)) data
    

    【讨论】:

      【解决方案2】:

      使用双精度lapply

      L <- list(
          list(rnorm(10),rnorm(10)),
          list(c(rnorm(10),NA),rnorm(10)),
          list(rnorm(10),rnorm(10))
          )
      str(L)
      
      L_out <- lapply(L, lapply, function(x) c(max(x),mean(x), mean(x,na.rm=TRUE)))
      str(L_out)
      # List of 3
      #  $ :List of 2
      #   ..$ : num [1:3] 0.958 0.127 0.127
      #   ..$ : num [1:3] 0.981 -0.262 -0.262
      #  $ :List of 2
      #   ..$ : num [1:3] NA NA -0.443
      #   ..$ : num [1:3] 1.126 -0.504 -0.504
      #  $ :List of 2
      #   ..$ : num [1:3] 1.432 -0.174 -0.174
      #   ..$ : num [1:3] 1.102 -0.311 -0.311
      

      【讨论】:

      • 如果3级有list的话,恐怕会报invalid type of argument错误
      • @gd047 是的,但这取决于您要在子列表上应用的功能。例如,如果您有 data.frames 列表的列表,并且您想要 rbind 这个 data.frames 然后使用lapply(L, lapply, function(x) do.call(rbind,x)。当您有列表而不是列表时,我的解决方案是解决方法。
      猜你喜欢
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      相关资源
      最近更新 更多