迭代嵌套列表

时间:2017-05-26 23:05:26

标签: r list function for-loop nested-lists

编辑:我创建了一些可重现的数据。

我试图迭代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,一个额外的for循环,llply。我想也许可以编写一个函数来完成我的分析,然后使用llply。但是,使用此功能:

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

它仍然不起作用。新列表'test'又回来了。

我尝试了一个嵌套for循环。

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

2 个答案:

答案 0 :(得分: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
}

在for循环的'tempobj = head((波形[[i]])[[j]],n = binsize)'行中,我忽略了将括号放在“波形[[i]]”周围。再次生成名称时。现在这就像一个魅力!

再次感谢所有输入。希望这个解决方案可以帮助别人。 -etg

答案 1 :(得分: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
>
相关问题