【问题标题】:Subset nested data frame with dplyr使用 dplyr 子集嵌套数据框
【发布时间】:2018-06-10 12:07:12
【问题描述】:

我想用dplyr 子集嵌套数据框的内部数据框?

我有以下嵌套数据框:

library(dplyr)

# Initialise nested data frame
d <- tibble(group = c("A", "B"),
            data = rep(list(NA), 2))

set.seed(1)
d$data[[1]] <- data.frame(x = seq(1:10),
                          y = rnorm(10))
d$data[[2]] <- data.frame(x = seq(1:15),
                          y = rnorm(15),
                          z = runif(15))

假设我只想要group == "A" 的数据框中的行,其中y &gt;= 0,而group == B 的数据框保持不变。 编辑: 运算后两个结果数据框应该有相同的变量。

我正在考虑使用 mutate 命令执行类似于下面的行的操作,但 filter(y &gt;= 0) 在这里不起作用。那么,我该怎么做呢?

d %>% filter(group == "A") %>% select(data) %>% filter(y >= 0)

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以通过在map2 中执行filtering 来做到这一点

    library(tidyverse)
    d %>%
        mutate(data = map2(group, data, ~
                                    .y %>% 
                                         filter(!(.x == "A" &  y < 0))))
     # A tibble: 2 x 2
     #  group data                 
     #  <chr> <list>               
     #1 A     <data.frame [6 × 2]> 
     #2 B     <data.frame [15 × 3]>
    

    使用反向比较,它会是

    out <- d %>%
             mutate(data = map2(group, data, ~
                             .y %>%
                               filter((.x == "A" & y >=0)|.x != "A")))
    out
    # A tibble: 2 x 2 
    #  group data                 
    #  <chr> <list>               
    #1 A     <data.frame [6 × 2]> 
    #2 B     <data.frame [15 × 3]>
    
    map(d$data, dim)
    #[[1]]
    #[1] 10  2
    
    #[[2]]
    #[1] 15  3
    
    map(out$data, dim)
    #[[1]]
    #[1] 6 2
    
    #[[2]]
    #[1] 15  3
    

    【讨论】:

      【解决方案2】:

      您希望基于两个变量(groupy)来 filter。但是,其中一个变量 (y) 是嵌套变量 (data) 的一部分。如果您首先通过unnest 访问数据,则通过filter 访问这两个变量要容易得多。如果你真的需要,你可以再次nest你的数据。

      library(tidyverse)
      
      # Initialise nested data frame
      d <- tibble(group = c("A", "B"),
                  data = rep(list(NA), 2))
      
      set.seed(1)
      d$data[[1]] <- data.frame(x = seq(1:10),
                                y = rnorm(10))
      d$data[[2]] <- data.frame(x = seq(1:15),
                                y = rnorm(15),
                                z = runif(15))
      d %>%
        unnest() %>%                        # unnest data
        filter(!(group == "A" & y < 0)) %>% # exclude rows where y < 0 for group A
        group_by(group) %>%                 # for each group
        nest()                              # nest data
      
      # # A tibble: 2 x 2
      #     group data             
      #     <chr> <list>           
      #   1 A     <tibble [6 x 3]> 
      #   2 B     <tibble [15 x 3]>
      

      【讨论】:

      • 如果我有多个变量,我已将嵌套数据框分组——让我们说:组、颜色、年龄。然后我可以在取消嵌套之前以一种聪明的方式保存这些分组变量,并提供group_by() 命令吗?
      • 如果您在nest 之前执行filter 部分,那将是理想的数据。这将节省您取消嵌套然后再次嵌套的时间。那么,如果你想基于多个变量nest,那还是可以的,但感觉又是一个问题,对吧?不再与filter 问题有关。
      • 如果我不是很清楚,您可以发布另一个问题,与使用多个变量的嵌套更相关。
      • 我明白你的意思。这是一个不同的问题。我对取消嵌套所有数据的主要担忧是它相当占用 CPU,当我重新嵌套时,我会在数据框中得到 z 变量,这是我不想要的。这就是为什么我想立即对组A 的内部数据框进行操作。
      • 好的,所以您正在寻找不使用 unnest 的解决方案。我会看看我能做什么.....
      猜你喜欢
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 2018-04-20
      相关资源
      最近更新 更多