фильтрация вложенного информационного кадра (столбца списка) по значениям в списке с помощью purrr - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть фрейм данных, включая столбец списка.Я хочу отфильтровать этот (вложенный) столбец списка (data, содержащий фрейм данных) по содержащемуся в нем столбцу unit со значениями, содержащимися в другом списке (x).Я думаю, что я довольно близок, проблема в том, что мне не удается «преобразовать» список x в вектор для оператора фильтра.Отлично подходит для любой подсказки!

library(tidyverse)

фрейм данных:

df<- structure(list(data = list(structure(list(unit = c("A1", "A2"
), value = c("10", "10")), class = c("tbl_df", "tbl", "data.frame"
), .Names = c("unit", "value"), row.names = c(NA, -2L)), structure(list(
  unit = c("B1", "B2", "A1"), value = c("10", "10", "10")), class = c("tbl_df", 
                                                                      "tbl", "data.frame"), .Names = c("unit", "value"), row.names = c(NA, 
                                                                                                                                       -3L)), structure(list(unit = c("C1", "B2"), value = c("10", "10"
                                                                                                                                       )), class = c("tbl_df", "tbl", "data.frame"), .Names = c("unit", 
                                                                                                                                                                            "value"), row.names = c(NA, -2L))), x = list(c("A1", "A2"), c("B1", 
                                                                                                                                                                                                                                                              "B2"), "C1")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
                                                                                                                                                                                                                                                                                                                                     -3L), .Names = c("data", "x"))

Это работает, только если x имеет только один элемент:

df1 <- df %>% 
  mutate(y=map(data, ~filter(., unit %in% x)))

flatten_chrсоздает вектор, включающий значения, содержащиеся в x всех (!) строк, а не для списка в строке.

df1 <- df %>% 
  mutate(y=map(data, ~filter(., unit %in% flatten_chr(x))))

Похоже, что критические проблемы заключаются в том, как преобразовать x в вектор встроки. * * тысяча двадцать-один

1 Ответ

0 голосов
/ 09 февраля 2019

Вместо этого вы можете использовать map2() для итерации по data и x параллельно, то есть по строкам.

df %>%
  mutate(y= map2(data, x, ~ filter(..1, unit %in% ..2))) # using ..1/..2 instead of .x/.y, to avoid confusion 

# A tibble: 3 x 3
  data             x         y               
  <list>           <list>    <list>          
1 <tibble [2 × 2]> <chr [2]> <tibble [2 × 2]>
2 <tibble [3 × 2]> <chr [2]> <tibble [2 × 2]>
3 <tibble [2 × 2]> <chr [1]> <tibble [1 × 2]>

В этом шаблоне вам больше не нужно flatten_chr(), поскольку x / ..2 уже является символьным объектом внутри функции отображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...