2010-05-21 32 views
1

我想将我的函数仅应用于列表结构中较深的元素。将apply()仅应用于深度嵌入列表元素

例如,我想应用某个函数来仅列出第二个元素的元素。 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 

回答

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 
+0

如果在第三级有一个列表,恐怕你会得到一个'inv alid类型的参数“错误 – 2010-05-21 11:28:38

+0

@ gd047是的,但它取决于您想要应用于子列表的函数。例如,如果你有data.frames列表的列表,并且你想要绑定这个data.frames然后使用'lapply(L,lapply,function(x)do.call(rbind,x)'。我的解决方案是解决方法当你有名单而不是名单。 – Marek 2010-05-21 12:57:46

+0

这很酷... – 2010-05-22 12:20:06

-1

不知道“r”,但我确定您可以应用适用于您的函数的函数。 让您的Funktion是F,则反而以F写申请(申请F)

在Haskell十岁上下

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

假设我们要1添加到每个号码:

map (map (+1)) data 
相关问题