2013-11-27 38 views
1

我使用lapply和mapply來創建一堆操作。我的數據由列表組成。創建列表清單的有效方法

對於其中一個計算,我在如何使用任何應用函數時遇到了一些問題。這是我想要做的一個例子:

#list with a collection of objects, each object has a vector with the their 2 closest neighbors identification. 
list_a<-list(c(2,4),c(1,3),c(1,4),c(3,2)) 

#list with the obs of each point 
list_obs<-list(runif(1000,1,2),runif(1000,0,2),runif(1000,0.5,2),runif(1000,0.1,1.5)) 

位置n在list_a對應的嘶鳴。點n

位置n在list_obs點對應點n

的意見我想要做的是創建將在每個位置n的neighb的觀察之列存儲一個新的列表。分:

#output 
out=list(list(list_obs[[2]],list_obs[[4]]),list(list_obs[[1]],list_obs[[3]]),list(list_obs[[1]],list_obs[[4]]),list(list_obs[[3]],list_obs[[2]])) 
> str(out) 
List of 4 
$ :List of 2 
    ..$ : num [1:1000] 1.673 1.423 0.228 1.758 1.65 ... 
    ..$ : num [1:1000] 0.679 1.341 0.148 0.867 0.724 ... 
$ :List of 2 
    ..$ : num [1:1000] 1.25 1.5 1.58 1.54 1.6 ... 
    ..$ : num [1:1000] 0.526 1.545 1.848 0.711 0.697 ... 
$ :List of 2 
    ..$ : num [1:1000] 1.25 1.5 1.58 1.54 1.6 ... 
    ..$ : num [1:1000] 0.679 1.341 0.148 0.867 0.724 ... 
$ :List of 2 
    ..$ : num [1:1000] 0.526 1.545 1.848 0.711 0.697 ... 
    ..$ : num [1:1000] 1.673 1.423 0.228 1.758 1.65 ... 

任何人都可以告訴我最好的辦法嗎?

我的數據很龐大,因此循環需要花費很多時間來運行。數據由3000點(3000-1鄰近點)組成,每點有20,000個觀測值。

+0

正如你所描述的你的數據,它可能是一個矩陣,左邊的兩列爲鄰居,和1000列的觀察。這可能更簡單。在循環中,對於循環而言(暗含)比內置應用(比如應用)要慢,這是一個神話,儘管你這樣做可能會導致效率低下。有些東西比如plyr可能更快..下面的例子..你可能會嘗試dput(頭(somedata,50))爲一個可重現的例子。 –

+0

我不知道有一個最大的矩陣大小除了內存,看看爲什麼列表使用較少的內存或比相同元素的矩陣更容易處理。如果數據真的很大,可以考慮將它放在rsqlite和/或使用dplyr包中。 –

回答

1

您是否嘗試過以下命令?

lapply(list_a, function(x) list_obs[x]) 
1
lapply(list_a,FUN=function(x)lapply(x,FUN=function(y)list_obs[y])) 

但是,按照意見,有可能是一個更好的方式來做到這一點剛回答

對不起鋸!

lapply(list_a,FUN=function(x)list_obs[x]) 

更好!

+0

不用擔心!無論如何,感謝您的幫助。 –