我有一个列表," 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
有谁知道如何实现我想要的目标?
答案 0 :(得分:2)
我们可以使用lapply
和seq_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
答案 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
数据。