2010-05-21 65 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