подсчитать количество объектов списка по определенному значению в элементе списка - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть список из 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 голосов
/ 08 ноября 2018

Просто приведите минимальный воспроизводимый пример. В стиле 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

Создано в 2018-11-09 пакетом представ. (v0.2.1)

0 голосов
/ 08 ноября 2018

Вот ответ с 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()
0 голосов
/ 08 ноября 2018

Функция unlist перенесет все объекты в списке в вектор. Затем вы можете использовать цикл или lapply для подсчета количества раз, когда значение встречается во внутреннем списке.

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

Это должно вернуть вектор длины 1000, который говорит вам, сколько var0001 - var0020 имеют значение 1.

...