I sh для сохранения / удаления элементов во вложенном списке PURRR на основе подсписка на каждом сгруппированном уровне - PullRequest
0 голосов
/ 14 января 2020

У меня есть наборы данных метеостанции, которые я буду sh сравнивать по месту. Мне нужно сделать это эффективно, потому что каждый набор большой, и я буду sh, чтобы создать свой опыт с PURRR. Моя проблема касается использования keep / discard (или list.exclude (rlist)) для удаления дней (id) с неполными данными - это должно быть неестественно, но я не могу понять синтаксис правильно. Я попытался подойти к этой проблеме, вычислив размеры каждого элемента, а затем использовал длину, чтобы получить единый список). Я использую R 3.6.1 на P C, работающем Windows 10. Вот тривиальный пример. Я sh 'mylist' должен содержать id = 'a' только в этом примере.

mylist <- tibble(id = c(rep("a",5),rep("b",4)),
                 dl = c(seq(1,5,1), seq(1,4,1)),
                 v = c(seq(0, 40, 10), seq(50, 80, 10))) %>%
  group_by(id) %>%
  nest() %>%
  mutate(ddim = map(data, dim)) %>%
  mutate(nn = map(ddim, extract(1)))
mylist
# A tibble: 2 x 4
# Groups:   id [2]
  id              data ddim      nn       
  <chr> <list<df[,2]>> <list>    <list>   
1 a            [5 x 2] <int [2]> <int [1]>
2 b            [4 x 2] <int [2]> <int [1]>

1 Ответ

1 голос
/ 14 января 2020

Непонятно, как определяется «неполные данные», но, поскольку вопрос больше в том, как фильтровать строки, в которых выполняется определенное условие в списке, я рассмотрел временное условие, а именно выбор строк, где столбец v tibble имеет первое значение как 0. Это условие может быть изменено после уточнения из OP.

Мы можем использовать filter для выбора строк и от map_lgl до l oop над data столбцом для каждого id.

library(tidyverse)

mylist %>% filter(map_lgl(data, ~first(.x$v) == 0))

# id              data
#  <chr> <list<df[,2]>>
#1 a            [5 × 2]

Аналогично, в базе R, мы можем использовать subset с sapply

subset(mylist, sapply(data, function(x) x$v[1] == 0))

data

mylist <- tibble(id = c(rep("a",5),rep("b",4)),
             dl = c(seq(1,5,1), seq(1,4,1)),
             v = c(seq(0, 40, 10), seq(50, 80, 10))) %>%
           group_by(id) %>% nest()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...