通过列表元素中的特定值计算列表对象的数量

时间:2018-11-08 17:34:05

标签: r list loops object element

我有一个包含1000个列表对象的列表。在任何一个中,我都有20个列表元素var0001:var0020(每个元素的长度不一定与其他元素相同,我的意思是mylist [[]] $ var0001的长度为1,但mylist [[]] $ var0012的长度= 1000)。

例如,当列表元素的列表元素var0002 = 1时,我需要一个函数让我计算列表中列表对象的数量。

我尝试的方法如下:

sum(mylist[[]]$var0002 == 1)

辛勤工作。

我可以用非常奇怪的代码得到它,

j <- 1
for(i in 1:length(mylist)){
   if(mylist[[i]]$var0002 %in% 1){
     dum[[j]] <- mylist[[i]]
     j <- j + 1
   }
}  

所以我想改进它,也许不用循环...我很确定有大约1或2行的方法。

3 个答案:

答案 0 :(得分:1)

这是purrr的答案。

library(purrr)

## dummy data
myList <- list(list(var1 = 1, var2 = 1), list(var1 = 0, var2 = 2), list(var1 = 1, var2 = 1))

myList %>% 
     purrr::map(~ .[["var2"]] == 1) %>% 
     unlist() %>% 
     sum()

答案 1 :(得分:0)

取消列表功能会将列表中的所有对象放入向量中。然后,您可以使用循环或重叠应用来计算值在内部列表中出现的时间。

sapply(1:length(mylist), function(a) sum(unlist(mylist[[a]])==1))

这应该返回一个长度为1000的向量,该向量告诉您有多少var0001-var0020的值为1。

答案 2 :(得分:0)

仅举一个最小的可复制示例。 tidyverse风格,

mylist <- 
    list(
        list01= list(
            var01 = 1:3
            ,var02 = 1:5
            ,var03 = 1:7
        )
        ,list02= list(
            var01 = 1:9
            ,var02 = 1:11
            ,var03 = 1:13
        )

    )
str(mylist)
#> List of 2
#>  $ list01:List of 3
#>   ..$ var01: int [1:3] 1 2 3
#>   ..$ var02: int [1:5] 1 2 3 4 5
#>   ..$ var03: int [1:7] 1 2 3 4 5 6 7
#>  $ list02:List of 3
#>   ..$ var01: int [1:9] 1 2 3 4 5 6 7 8 9
#>   ..$ var02: int [1:11] 1 2 3 4 5 6 7 8 9 10 ...
#>   ..$ var03: int [1:13] 1 2 3 4 5 6 7 8 9 10 ...

library(purrr)
mylist %>% 
    transpose() %>% 
    .$var02 %>% 
    unlist %>% 
    table()
#> .
#>  1  2  3  4  5  6  7  8  9 10 11 
#>  2  2  2  2  2  1  1  1  1  1  1

reprex package(v0.2.1)于2018-11-09创建