2016-08-16 125 views
1

这是来自此one的后续问题,我想在列表中创建一个列表,现在我希望能够访问嵌套列表并在其中实现函数太。如何使用循环访问列表中的所有列表

我有3个列表,其内具有两个列表:

my_list 

    structure(list(a = structure(list(a = structure(list(value = c(1L, 
4L), class = structure(c(1L, 1L), .Label = c("a", "b", "c"), class = "factor")), .Names = c("value", 
"class"), row.names = c(1L, 4L), class = "data.frame"), b = structure(list(
    value = c(2, 1), class = structure(c(2L, 2L), .Label = c("a", 
    "b", "c"), class = "factor")), .Names = c("value", "class" 
), row.names = c(2L, 5L), class = "data.frame")), .Names = c("a", 
"b")), b = structure(list(a = structure(list(value = c(6, 1), 
    class = structure(c(1L, 1L), .Label = c("a", "b", "c", "d" 
    ), class = "factor")), .Names = c("value", "class"), row.names = c(1L, 
5L), class = "data.frame"), b = structure(list(value = c(5, 1 
), class = structure(c(2L, 2L), .Label = c("a", "b", "c", "d" 
), class = "factor")), .Names = c("value", "class"), row.names = c(2L, 
6L), class = "data.frame")), .Names = c("a", "b")), c = structure(list(
    a = structure(list(value = 5:6, class = structure(c(1L, 1L 
    ), .Label = c("a", "b", "c", "d", "e"), class = "factor")), .Names = c("value", 
    "class"), row.names = 5:6, class = "data.frame"), b = structure(list(
     value = c(4, 1), class = structure(c(2L, 2L), .Label = c("a", 
     "b", "c", "d", "e"), class = "factor")), .Names = c("value", 
    "class"), row.names = c(4L, 7L), class = "data.frame")), .Names = c("a", 
"b"))), .Names = c("a", "b", "c")) 

    $a 
    $a$a 
     value class 
     1  a 
     4  a 

    $a$b 
     value class 
     2  b 
     1  b 


    $b 
    $b$a 
     value class 
     6  a 
     1  a 

    $b$b 
     value class 
     5  b 
     1  b 


    $c 
    $c$a 
     value class 
     5  a 
     6  a 

    $c$b 
     value class 
     4  b 
     1  b 

我通过value != 1subset每个嵌套列表使用循环使得所得到的名单看起来是这样的:

my_list 
$a 
     $a$a 
      value class 
      4  a 

     $a$b 
      value class 
      2  b 



     $b 
     $b$a 
      value class 
      6  a 


     $b$b 
      value class 
      5  b 



     $c 
     $c$a 
      value class 
      5  a 
      6  a 

     $c$b 
      value class 
      4  b 

有了下面的代码,我只能访问list [[1]][[1]]list[[2]][[2]]list[[3]][[3]]。我如何通过循环访问其他人并应用subset函数?

for (i in 1:length(my_list)) { 
    my_list[[i]][[i]] <- subset(my_list[[i]][[i]],my_list[[i]][[i]]$value=1) 
} 
+0

我注意到您没有链接到您昨天就此主题提出的问题。如果两者不同,请说明http://stackoverflow.com/questions/38954154/using-a-loop-or-vectorisation-to-subset-a-list-by-multiple-elements-in-a-vecto –

+0

好主意,编辑好吧 – Bonono

+1

好点 - 现在修好了 – Bonono

回答

1

我们可以使用嵌套lapplyrapply

lapply(my_list, function(x) lapply(x, function(y) subset(y, value!=1))) 
#$a 
#$a$a 
# value class 
#4  4  a 

#$a$b 
# value class 
#2  2  b 


#$b 
#$b$a 
# value class 
#1  6  a 

#$b$b 
# value class 
#2  5  b 


#$c 
#$c$a 
# value class 
#5  5  a 
#6  6  a 

#$c$b 
# value class 
#4  4  b 
+0

我真的应该学习如何使用lapply。是不是可以用循环做到这一点? – Bonono

+0

@Bonono你有一个嵌套循环,一种方法是通过循环或者将其转换为单个数据集来进行嵌套循环,过滤'值'然后再转换回嵌套表单(这是不必要的复杂) – akrun

+1

我同意,当你这样说时,这听起来很荒谬。谢谢你的帮助akrun,你一直都很棒。我一定会在博士学位上承认你! – Bonono

1

对于那些想知道如何为这个问题做一个嵌套的循环 - 我必须帮助摸不着头脑:

for (i in 1:length(my_list)) { 
    for (j in 1:2) { 
    my_list[[i]][[j]] <- subset(my_list[[i]][[j]],my_list[[i]][[j]]$value!=1) 
    } 
} 
+1

在'subset'里面,你可以使用'value!= 1',即'my_list [[i]] [[j]] - 子集(my_list [[i]] [[j]],值!= 1 )' – akrun