子集使用dplyr嵌套数据框

时间:2018-06-10 12:07:12

标签: r dplyr

我想用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 >= 0,而group == B的数据框保持不变。 编辑: 操作后,两个结果数据框应具有相同的变量。

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

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

2 个答案:

答案 0 :(得分:2)

您希望filter基于两个变量(groupy)。但是,其中一个变量(y)是嵌套变量(data)的一部分。如果您首先filter数据,则可以通过unnest更轻松地访问这两个变量。如果确实需要,您可以再次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]>

答案 1 :(得分:2)

我们可以通过filter

内的map2来完成
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