R 将函数应用于嵌套列表

R 将函数应用于嵌套列表,r,R,我已经发布了一个非常类似的问题,但情况已经发生了变化,我得到的答案对这些“新特征”无效 旧帖: 我想知道是否有可能在嵌套列表的不同级别应用函数,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=1

我已经发布了一个非常类似的问题,但情况已经发生了变化,我得到的答案对这些“新特征”无效

旧帖:

我想知道是否有可能在嵌套列表的不同级别应用函数,
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))
也许是
rappy
mappy
的组合

谢谢

新帖子:

@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)
}
您可以使用:

lapply(pval.list, function(x){apply(do.call(rbind, x), 2, Fisher.test)})
[[1]]
[1] 1.953968e-03 2.999509e-05 5.320831e-04 1.339104e-02

[[2]]
[1] 0.0007878665 0.0052625525 0.0457435481 0.1146067577

[[3]]
[1] 8.982382e-03 3.055250e-08 1.064109e-02 5.094879e-02

[[4]]
[1] 9.911091e-03 2.032293e-06 8.073256e-03 1.458443e-02

[[5]]
[1] 2.357950e-03 6.135981e-11 3.326486e-01 6.038488e-01

[[6]]
[1] 6.597414e-03 3.470933e-09 3.362226e-01 5.708789e-01

也许使用
plyr
包可以更快地完成,但是下面的方法很好。首先创建一个新列表,其中内部列表转换为矩阵

new.pval.list <- vector('list', length(pval.list))
for (i in 1:length(pval.list)) {
  nc <- length(unlist(pval.list[[i]] [1]))
  new.pval.list [[i]] <- matrix(unlist(pval.list[[i]]), ncol = nc, byrow = T)
}

以下内容对你有用吗

我的解决方案使用嵌套的
lappy

1.

lapply(lapply(list, function(l)do.call(rbind, l)), colSums)
lapply(lapply(pval.list, function(l)do.call(rbind, l)), apply, 2, Fisher.test )
2.

lapply(lapply(list, function(l)do.call(rbind, l)), colSums)
lapply(lapply(pval.list, function(l)do.call(rbind, l)), apply, 2, Fisher.test )

虽然
Reduce
不能直接应用于
Fisher.test
,但它可以应用于
cbind
,然后
Fisher.test
可以应用于:

> lapply(lapply(pval.list, Reduce, f = cbind), apply, 1, Fisher.test)
[[1]]
[1] 1.953968e-03 2.999509e-05 5.320831e-04 1.339104e-02

[[2]]
[1] 0.0007878665 0.0052625525 0.0457435481 0.1146067577

[[3]]
[1] 8.982382e-03 3.055250e-08 1.064109e-02 5.094879e-02

[[4]]
[1] 9.911091e-03 2.032293e-06 8.073256e-03 1.458443e-02

[[5]]
[1] 2.357950e-03 6.135981e-11 3.326486e-01 6.038488e-01

[[6]]
[1] 6.597414e-03 3.470933e-09 3.362226e-01 5.708789e-01
增加:

这可以使用以下方法稍微缩短:

lapply(lapply(pval.list, simplify2array), apply, 1, Fisher.test)
lapply(lapply(pval.list, data.frame), apply, 1, Fisher.test)
或者像这样使用
data.frame

lapply(lapply(pval.list, simplify2array), apply, 1, Fisher.test)
lapply(lapply(pval.list, data.frame), apply, 1, Fisher.test)

您的方法类似于user1609452提出的方法,非常有效,thanksI得到以下错误:
应用中的错误(mat,2,Fisher.test):dim(X)必须具有正长度