访问列表

时间:2016-04-06 16:03:25

标签: r

我可能会问一个错误的问题,因为可能没有其他方法可以做我的意图,但是看到列表的专用包我将不得不问如何访问列表中的深度变化的元素(子列表的数量各不相同,元素在子列表中高度嵌入。我知道您可以通过使用brakets递归索引来访问或提取元素,但是如果子列表的数量很大且列表中的子列表的deph在列表中变化,则这变得不切实际。 / p>

我的目标是访问子列表以捕获和更改子列表中的所有整数(0)元素并将它们更改为NULL或0.我从其他响应中知道您可以使用length来评估是否存在整数(0 )没有空列表的元素,但主要问题在于以括号索引的另一种方式访问​​最低级别。 (unlist仅适用于退出项而不是整数(0)的情况)。长度适用于通过制动器进行完美分度,长度高于长度一级(x [[i]])。

x <- list(list(list(c(1,2)),list(c(3,4))),list(list((integer(0)),c(7,8) )))

str(x) 

List of 2
$ :List of 2
..$ :List of 1
.. ..$ : num [1:2] 1 2
..$ :List of 1
.. ..$ : num [1:2] 3 4
$ :List of 1
..$ :List of 2
.. ..$ : int(0) 
.. ..$ : num [1:2] 7 8

x[[1]][[1]][[1]] # the first element in sublist 1
# 1 2 
x[[2]][[1]][[1]] # the first element in sublist 2
# integer(0)
length (x[[2]][[1]][[1]])
[1] 0
lengths(x[[2]][[1]]) # will work by going one way down the sublist as to check for length. 

编辑:

如果x将具有比上述情况更进一步的下降,则评论或答案中提出的解决方案将不会足够深入以测量元素的长度并提取整数(0),并且它将不起作用。你会怎么做呢。

x <- list(list(list(list(list(c(1,2)),list(c(3,4))),list(list((integer(0)),c(7,8) )))))

str(x) 
List of 1
$ :List of 1
..$ :List of 2
.. ..$ :List of 2
.. .. ..$ :List of 1
.. .. .. ..$ : num [1:2] 1 2
.. .. ..$ :List of 1
.. .. .. ..$ : num [1:2] 3 4
.. ..$ :List of 1
.. .. ..$ :List of 2
.. .. .. ..$ : int(0) 
.. .. .. ..$ : num [1:2] 7 8

1 个答案:

答案 0 :(得分:3)

我认为rapply()lapply()的递归版本适用于您的情况。

试试这个:

y <- rapply(x, f = function(x)if(length(x)==0) 0 else x, how = "list")
str(y)

List of 2
 $ :List of 2
  ..$ :List of 1
  .. ..$ : num [1:2] 1 2
  ..$ :List of 1
  .. ..$ : num [1:2] 3 4
 $ :List of 1
  ..$ :List of 2
  .. ..$ : num 0
  .. ..$ : num [1:2] 7 8