2014-07-12 83 views
1

我正在開發a function that parses a nested list。不幸的是,由於原始數據的性質,我無法想象如何繞過這樣做。函數中的最後三位代碼嚇了我一下,但他們確實完成了工作。在這裏,他們是:解析嵌套列表的元素的更有效方法

mkList <- lapply(rec, function(x){ 
     lapply(regex, function(y) grep(y, x, value = TRUE)) }) 
rem <- lapply(mkList, function(x){ 
     lapply(x, function(y) sub("[a-z]+,", "", y)) }) 
lapply(rem, read.as.csv) 

是的,你是正確的看到的是,這是對lapply連續5個電話。是的,你猜對了,read.as.csv還呼籲lapply


,使一個小重複的例子,考慮嵌套列表x和下一個「雙」 lapply塊。結果正是我想要的,但我很好奇

是否有更好,更有效的方法將函數應用於嵌套列表的內部列表?

內部列表元素是不同字符串長度的csv向量。

> (x <- list(list(a = c("a,b,c", "d,e,f"), 
        b = c("1,2,a,b,c,d", "3,4,e,f,g,h")))) 

# [[1]] 
# [[1]]$a 
# [1] "a,b,c" "d,e,f" 
# 
# [[1]]$b 
# [1] "1,2,a,b,c,d" "3,4,e,f,g,h" 

> lapply(x, function(y){ 
     lapply(y, function(z) do.call(rbind, strsplit(z, ","))) 
    }) 

# [[1]] 
# [[1]]$a 
#  [,1] [,2] [,3] 
# [1,] "a" "b" "c" 
# [2,] "d" "e" "f" 
# 
# [[1]]$b 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] "1" "2" "a" "b" "c" "d" 
# [2,] "3" "4" "e" "f" "g" "h" 
+2

你在找'rapply'嗎? 'rapply(x,function(y)do.call(rbind,strsplit(y,「,」,TRUE)),how =「replace」)'。 – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto,你正在成爲我深夜問問題的原因。哈哈 –

回答

2

其中在*apply家庭鮮爲人知的功能是rapply - 用於「遞歸lapply」。好像你正在試圖做的:

rapply(x, function(y) do.call(rbind, strsplit(y, ",", TRUE)), how = "replace") 
# [[1]] 
# [[1]]$a 
#  [,1] [,2] [,3] 
# [1,] "a" "b" "c" 
# [2,] "d" "e" "f" 
# 
# [[1]]$b 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] "1" "2" "a" "b" "c" "d" 
# [2,] "3" "4" "e" "f" "g" "h" 

對於這個特殊的例子,它是你的做法背後陰影,但是當你擴展的例子了,它被證明是更有效的。

+0

我會給他們兩個'system.time'旋風。 –

+0

你知道嗎,我傳遞了兩個變量。在第一個中,'rec'和'regex'都進去了。我可以在'mapply'中使用'rapply'中的兩個變量嗎?幫助文件說'f'是單個變量 –

+0

@RichardScriven的函數,未經測試,但不是'''在'rapply'中的用途? (它被定義爲*傳遞給'f'的附加參數*) – A5C1D2H2I1M1N2O1R2T1