首页 > 解决方案 > 我希望根据每个分组级别内的子列表保留/丢弃 PURRR 嵌套列表中的项目

问题描述

我有一组气象站数据,我希望按站点进行比较。我需要有效地做到这一点,因为每组都很大,我希望通过 PURRR 积累我的经验。我的问题涉及使用保留/丢弃(或 list.exclude (rlist))来删除数据不完整的天数(id) - 它应该是一个笨拙的但我无法获得正确的语法。我试图通过计算每个小标题的尺寸来解决这个问题,然后使用长度给我一个单一的列表)。我在运行 Windows 10 的 PC 上使用 R 3.6.1。这是一个简单的示例。我希望 '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]>

标签: rpurrr

解决方案


目前尚不清楚如何定义“不完整数据”,但由于问题更多是关于如何过滤列表中满足特定条件的行,因此我考虑了一个临时条件,即选择vtibble 列具有第一个值的行0.这个条件可以在OP澄清后改变。

我们可以使用filter来选择行并map_lgl循环遍历data每个id.

library(tidyverse)

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

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

同样,在基数 R 中,我们可以使用subsetwithsapply

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

数据

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()

推荐阅读