2017-05-26 213 views
0

編輯:我創建了一些可重現的數據。通過嵌套列表進行迭代

我正在嘗試遍歷R中的嵌套列表,並且無法完全正確地獲取函數/ for循環。

樣品我的數據:

> str(waveforms) 
List of 3 
$ Sta2_Ev20:List of 7 
..$ 1: num [1:10000] 5.88e-05 -2.84e-05 -5.50e-05 7.02e-05 1.90e-06 ... 
..$ 2: num [1:10000] 2.61e-05 -2.14e-05 -2.02e-05 2.97e-05 5.94e-06 ... 
..$ 3: num [1:10000] 1.08e-05 -4.12e-05 1.95e-05 3.03e-05 -4.55e-05 ... 
..$ 4: num [1:10000] 2.45e-05 -1.23e-05 -1.53e-05 2.76e-05 3.07e-06 ... 
..$ 5: num [1:10000] 2.29e-05 0.00 5.71e-06 -2.86e-05 5.71e-06 ... 
..$ 6: num [1:10000] -1.01e-04 2.37e-05 2.08e-05 -5.93e-06 2.08e-05 ... 
..$ 7: num [1:10000] 3.47e-05 -2.75e-05 0.00 1.45e-05 -1.45e-06 ... 
$ Sta2_Ev21:List of 34 
..$ 1 : num [1:10000] 1.35e-05 -3.46e-05 -3.46e-05 8.65e-05 -2.11e-05 ... 
..$ 2 : num [1:10000] 5.68e-05 1.14e-05 -7.38e-05 2.27e-05 4.73e-05 ... 
..$ 3 : num [1:10000] 8.21e-06 3.69e-05 -2.46e-05 1.64e-05 -8.21e-06 ... 
..$ 4 : num [1:10000] 3.26e-05 -1.34e-05 -1.19e-05 8.90e-06 1.78e-05 ... 
..$ 5 : num [1:10000] 2.43e-05 -3.00e-05 1.29e-05 2.86e-06 -1.00e-05 ... 
..$ 6 : num [1:10000] -6.87e-06 2.34e-05 -2.34e-05 3.44e-05 -2.20e-05 ... 
..$ 7 : num [1:10000] 1.23e-05 -5.75e-05 2.46e-05 1.23e-05 -2.74e-06 ... 
..$ 8 : num [1:10000] -2.34e-05 -2.17e-05 1.83e-05 4.17e-05 -4.50e-05 ... 
..$ 9 : num [1:10000] 3.34e-05 7.42e-06 -2.04e-05 7.42e-06 0.00 ... 
etc... 

重複性的數據

Sta2_Evt1=list(a=runif(10000, min=-12, max=12), b=runif(10000, min=-12, max=12),c=runif(10000, min=-12, max=12)) 
Sta2_Evt2=list(a=runif(10000, min=-2, max=2), b=runif(10000, min=-2, max=2),c=runif(10000, min=-2, max=2)) 
... 
waveforms=list(Sta2_Evt1,Sta2_Evt2,...)) 
binsize=5000 

等。我需要做的是遍歷列表中的每個列表。我測試了其中一個「Sta#_Evt#」列表中的數據。此前,此代碼工作:

ch0=list() 
for (i in seq_along(Sta2_Evt2)) { 
    tempobj=head(Sta2_Evt2[[i]],n=binsize) 
    name <- paste('click',names(Sta2_Evt2)[[i]],sep='') 
    ch0[[name]] <- tempobj 
} 

這很簡單,只是從每個元素中提取前5000個數據點。從這個新的元素列表(ch0)中,我能夠運行多個腳本來處理我的數據。但是,現在我需要擴展以包含我的所有數據,而不僅僅是我最初使用的測試集,我無法弄清楚如何在嵌套列表上運行迭代(如上面的波形)。例如,當我運行「ch0」的代碼時,在我的嵌套「波形」列表中返回相同的嵌套列表。

我已經嘗試了幾種方法:lapply,一個額外的循環,llply。我認爲可能寫一個函數來完成我的分析,然後使用llply。但是,使用此功能:

mkChs=function(x,binsize) {for (i in 1:length(x)) { 
    head(x[[i]],n=binsize) 
}} 
test=llply(waveforms,mkChs, binsize=5000) 

它仍然不起作用。新的「測試」列表空白。

我試過了一個循環的巢。

ch0=list() 
for (i in seq_along(waveforms)) { 
    a=list(names(waveforms)[[i]]) 
    b=for (j in seq_along(waveforms[i])) { 
    tempobj=head(waveforms[[i]][[j]],n=binsize) 
    name <- paste('click',seq_along(waveforms)[[i]][[j]]-1,sep='') 
    a[[name]] <- tempobj 
    } 
name1 <- names(waveforms)[[i]] 
ch0[[name1]] <- b 

}

返回以下內容:

str(ch0) 
List of 3 
$ Sta2_Ev20: num [1:5000] 5.88e-05 -2.84e-05 -5.50e-05 7.02e-05 1.90e-06 ... 
$ Sta2_Ev21: num [1:5000] 1.35e-05 -3.46e-05 -3.46e-05 8.65e-05 -2.11e-05 ... 
$ Sta2_Ev22: num [1:5000] 2.06e-05 3.44e-06 2.06e-05 -3.44e-05 0.00 ... 

不正是我所期待的。任何投入將不勝感激。我寧願沒有一個單獨的列表每個「Sta#_Evt#」來讓它正常運行。

乾杯! ETG

+0

建議你看看如下所述製作一個可重現的示例:https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – epi99

+0

我已添加一些可重複的數據在我創建的循環中以相同的方式運行。任何反饋將不勝感激。 – etgriffiths

回答

1

什麼。我使用了一個嵌套循環。原來我以前的循環丟失了一對括號!

ch0=list() 
for (i in seq_along(waveforms)) { 
    a=list() 
    b=for (j in seq_along(waveforms[[i]])) { 
    tempobj=head((waveforms[[i]])[[j]],n=binsize) 
    name <- paste('click',seq_along((waveforms)[[i]])[[j]]-1,sep='') 
    a[[name]] <- tempobj 
    } 
    name1 <- names(waveforms)[[i]] 
    ch0[[name1]] <- a 
} 

在 'TEMPOBJ =頭((波形[[I]])[[J],N = binsize)' 的for循環線,予忽略了周圍放置「波形[[括號一世]]」。並再次生成名稱。現在這就像一個魅力!

再次感謝所有的輸入。希望這個解決方案可以幫助別人。 -etg

0

我試圖創建一個最小的重複的例子,我想通了這一點,其可能會接近你想要

waveform <- list("a" = list('1' = c(1,2,3), '2' = c(4,5,6)), 
       "b" = list('1' = c(7,8,9), '2' = c(10,11,12))) 

# arbitrary function 
my_fun <- function(vec) { 
    return(mean(vec)) 
} 

# return list structure 
r1 <- lapply(waveform, function (x) { 
    lapply(x, my_fun)}) 

# return a two dimensional array 
r2 <- sapply(waveform, function (x) { 
    sapply(x, my_fun)}) 

str(r1) 
# List of 2 
# $ a:List of 2 
# ..$ 1: num 2 
# ..$ 2: num 5 
# $ b:List of 2 
# ..$ 1: num 8 
# ..$ 2: num 11 



r2 
# a b 
# 1 2 8 
# 2 5 11 
> 
+0

感謝您的評論!但是,我認爲問題在於我沒有像現在這樣在我的功能中運行統計數據。我試圖通過將每個向量10000個元素分成更多列表來重新組織數據。所以這不適用。 – etgriffiths