2017-05-26 169 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