Подсчет в нескольких вложенных списках R - PullRequest
0 голосов
/ 28 февраля 2020

Предположим, у меня есть список длины 2, в котором есть еще один список длины 2, в котором есть фрейм данных чисел, закодированных как 0, 1 или 2 (потерпите меня!):

set.seed(42)
l1<-data.frame(sample(0:2, 5, replace = TRUE))
l2<-data.frame(sample(0:2, 5, replace = TRUE))
l<-list(l1,l2)
ll<-list(list(l,l), list(l,l))

Мне нужно посчитать, сколько раз 1 или 2 появляется в каждом фрейме данных. Затем мне нужно сложить эти значения по всем показателям на уровне выше.

Так что для ll[[1]][[1]][[1]] число будет равно 1, для ll[[1]][[1]][[2]] число будет равно 4. Для этих двух кадров данных сумма будет 5.

Чтобы дать более простое описание реальных данных, с которыми я работаю, - Engli sh: верхний уровень - это количество видов (в данном примере 2 вида), уровень ниже этого это год, когда данные были записаны (в этом примере данные собираются за 2 разных года). Ниже это место, в котором данные записываются. Мне нужно знать, что за годы, сколько раз 1 или 2 появляется во всех местах (в течение года).

Возможно, есть лучший способ описать это, но пока он ускользает от меня. Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Мы можем использовать purrr функции.

library(purrr)
map(ll, function(x) transpose(x) %>% map(~sum(unlist(.x) != 0)))

#[[1]]
#[[1]][[1]]
#[1] 2

#[[1]][[2]]
#[1] 8


#[[2]]
#[[2]][[1]]
#[1] 2

#[[2]][[2]]
#[1] 8
0 голосов
/ 28 февраля 2020

Немного вложено, но решение должно работать:

lapply(ll, 
  function(l) 
    lapply(l, 
      function(li) sum(unlist(li) %in% 1:2)))

# [[1]]
# [[1]][[1]]
# [1] 5
#
# [[1]][[2]]
# [1] 5
# 
# 
# [[2]]
# [[2]][[1]]
# [1] 5
# 
# [[2]][[2]]
# [1] 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...