Как использовать dplyr :: filter inside purrr :: map - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть data.frame с несколькими переменными, и я хотел бы получить список, в котором каждый элемент представляет собой переменную data.frame, отфильтрованного по условию.

Например, скажем, у меня есть что-то вродечто:

df <- tribble(
  ~ var1, ~ var2, ~ var3,
  4, 0, 0,
  2, 3, 1,
  0, 4, 0
  )
#    var1  var2  var3
#   <dbl> <dbl> <dbl>
# 1     4     0     0
# 2     2     3     1
# 3     0     4     0

И я хочу получить список отфильтрованных переменных> 0

# $var1
# [1] 4 2
#
# $var2
# [1] 3 4
#
# $var3
# [1] 1

Я пробовал несколько вещей, но самое близкое, что я могу получить сейчас, это что-то вроде

df %>% map(~filter(df, .>0))

и я хотел бы включить dplyr::select, чтобы получить только фильтрованную переменную.Но я не могу понять, как это сделать.

Спасибо за помощь и извините за плохой английский, надеюсь, это все еще понятно.

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

Используя purrr::map мы можем сделать

purrr::map(df, ~.[.!= 0])

#$var1
#[1] 4 2

#$var2
#[1] 3 4

#$var3
#[1] 1

Базовый подход R с lapply может быть

lapply(df, function(x) x[x!= 0])
2 голосов
/ 24 апреля 2019

Мы можем пройти через names. Обратите внимание, что filter ожидает data.frame/tbl_df. С map мы перебираем столбцы, и это vector. Итак, чтобы заставить filter работать, от map до names, подмножество столбцов, применить filter и unlist

map(names(df), ~ df %>% 
                  select(.x) %>%
                  filter(. >0) %>%
                  unlist(., use.names = FALSE))

Или с split

split.default(df, names(df)) %>%
            map(~  .x %>% 
                       filter(. > 0) %>%
                        pull(1))

ПРИМЕЧАНИЕ. Вопрос ОП: How to use dplyr::filter inside purrr::map


Другие способы без использования dplyr::filter:

map(df, ~ keep(.x, .x != 0))

Или

map(df, setdiff, 0)

Или

map(df, ~ discard(.x, .x == 0))

или используя base R

lapply(df, setdiff, 0)
#$var1
#[1] 4 2

#$var2
#[1] 3 4

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