Подмножество вложенного фрейма данных с dplyr - PullRequest
0 голосов
/ 10 июня 2018

Я хотел бы установить для внутреннего фрейма данных вложенного фрейма данных 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 остается неизменным. Редактировать: Два результирующих фрейма данных должны иметь одинаковые переменные после операции.

Я думал сделать что-то вроде строки ниже, но в сочетании с мутированиемкоманда, но filter(y >= 0) здесь не работает.Итак, как мне это сделать?

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

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Мы могли бы сделать 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
0 голосов
/ 10 июня 2018

Вы хотите filter на основе двух переменных (group и y).Однако одна из переменных (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]>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...