【问题标题】:apply function in different levels of a nested list (re-post)在嵌套列表的不同级别应用函数(重新发布)
【发布时间】:2013-05-23 19:55:34
【问题描述】:

旧帖:

我想知道是否可以在嵌套列表的不同级别应用函数,rapply 在列表中递归地应用函数但在同一级别。我的问题与在不同级别应用不同长度的函数有关。举例说明:

list <- list(list(a=1:5, b=5:9, c=6:10, d=1:5),
             list(e=2:6, f=3:7, g=8:12),
             list(h=3:7, i=6:10, j=11:15, k=2:6),
             list(l=4:8, m=2:6),
             list(n=5:9, o=1:5, p=2:6, q=0:4),
             list(r=6:10, s=3:7, t=9:13))

我想将一个函数,例如 sum,应用到第一个元素(例如 [[1]]$a=1, [[1]]$b=5, [[1]]$c=6, [[1]]d=1,然后应用到第二个元素(例如 [[1]]$a=2, [[1]]$b=6, [[1]]$c=7, [[1]]$d=2) 等等。结果应该是这样的:

[[1]]
13 17 21 25 29

[[2]]
13 16 19 22 25

[[3]]
22 26 30 34 38

[[4]]
6 8 10 12 14

[[5]]
8 12 16 20 24

[[6]]
18 21 24 27 30

也许是rapplymapply 的组合?

谢谢

新帖子

@G.Grothendieck 已经为我提供了一个很好的解决方案,但是,我还有其他 pvalues 列表,我想在其中应用更复杂的函数,例如mean 或其他功能,例如:

Fisher.test <- function(p) {
  Xsq <- -2*sum(log(p))
  p.val <- 1-pchisq(Xsq, df = 2*length(p))
  return(p.val)
}

Reduce 不适用于 sumf="+" 等函数,有什么建议吗??

这是一个新列表的外观示例"

pval.list <- list(list(a=c(0.05, 0.0001, 0.32, 0.45), b=c(0.1,0.12,0.01,0.06), c=c(0.1,0.12,0.01,0.06), d=c(0.01,0.02,0.03,0.04)),
             list(e=c(0.04, 0.1, 0.232, 0.245), f=c(0.05, 0.01, 0.22, 0.54), g=c(0.005, 0.1, 0.032, 0.045)),
             list(h=c(0.03, 0.01, 0.12, 0.4), i=c(0.5, 0.0001, 0.132, 0.045), j=c(0.005, 0.0001, 0.0032, 0.045), k=c(0.5, 0.1, 0.932, 0.545)),
             list(l=c(0.022, 0.0012, 0.32, 0.45), m=c(0.0589, 0.0001, 0.0032, 0.0045)),
             list(n=c(0.051, 0.01, 0.32, 0.45), o=c(0.05, 0.0001, 0.32, 0.45), p=c(0.05, 0.0001, 0.32, 0.45), q=c(0.05, 0.0001, 0.32, 0.45)),
             list(r=c(0.053, 0.001, 0.32, 0.45), s=c(0.05, 0.0001, 0.32, 0.45), t=c(0.05, 0.0001, 0.32, 0.45)))

【问题讨论】:

    标签: r


    【解决方案1】:

    试试这个:

    > lapply(list, Reduce, f = "+")
    [[1]]
    [1] 13 17 21 25 29
    
    [[2]]
    [1] 13 16 19 22 25
    
    [[3]]
    [1] 22 26 30 34 38
    
    [[4]]
    [1]  6  8 10 12 14
    
    [[5]]
    [1]  8 12 16 20 24
    
    [[6]]
    [1] 18 21 24 27 30
    

    【讨论】:

    • 不错的把戏@G.Grothendieck,你能向我解释一下 Reduce 是做什么的吗?是否可以使用另一个功能,例如mean?谢谢
    • Reduce(f = "+", x)x[[[1]] + ... + x[[n]] 相同。
    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 2020-02-06
    • 1970-01-01
    相关资源
    最近更新 更多