查找大于0的列表元素的索引

时间:2018-02-19 04:08:23

标签: r

我有一个列表," my_list",在下面:

$`2015-03-01 00:18:50`
integer(0)

$`2015-03-01 11:19:59`
[1] 4 6

$`2015-03-01 12:18:29`
[1] 12 13

$`2015-03-01 13:19:09`
[1] 1

$`2015-03-01 17:18:44`
integer(0)

$`2015-03-01 22:18:49`
integer(0)

我想获取大于0的值的元素索引(不是子元素索引)(或者列表子元素非空的)。预期的输出是一个看起来像这样的列表:

2,2,3,3,4

我已经接近:

indices<-which(lapply(my_list,length)>0)

然而,这段代码只给出了以下内容,并没有说明列表元素中有多个子元素:

2,3,4

有谁知道如何实现我想要的目标?

3 个答案:

答案 0 :(得分:2)

我们可以使用lapplyseq_along技巧来引入列表中每个元素的索引。然后,对于每个列表元素,生成匹配索引的向量。最后,unlist整个列表以获得单个匹配向量。

x <- list(a=integer(0),b=c(4,6),c=c(12,13),d=c(1),e=integer(0),f=integer(0))

result <- lapply(seq_along(x), function(i) { rep(i, sum(x[[i]] > 0)) })

unlist(result)

[1] 2 2 3 3 4

Demo

答案 1 :(得分:1)

你可以尝试这个,我希望这是你所期望的,使用lengths计算列表中项目的长度,然后在rep命令中迭代该列表的每个项目以获得最终结果:

lyst <- list(l1=integer(0), l2= c(1,2), l3=c(3,4), l4=character(0), l5=c(5,6,6))

lyst1 <- lengths(lyst)

unlist(lapply(1:length(lyst1), function(x)rep(x, lyst1[[x]])))

<强>输出:

#> unlist(lapply(1:length(lyst1), function(x)rep(x, lyst1[[x]])))
#[1] 2 2 3 3 5 5 5

答案 2 :(得分:0)

按相应的长度重复每个数字索引:

rep(seq_along(x), lengths(x))
#[1] 2 2 3 3 4

使用@Tim的x数据。