R выбрать элементы из списка в конвейере - PullRequest
1 голос
/ 08 мая 2019

Я хочу выбрать элементы по индексу из списка, прежде чем применять к нему другую функцию, используя purrr: map. Я попробовал следующее, но не могу найти способ, который работает.

require(dplyr)
require(purrr)

dat <- list(1:3,
     4:6,
     letters[1:3])

# I can select one item

dat[1]

# I can select two items

dat[c(1,2)]

# But how can I do this in a pipeline by index?

dat %>% map(mean)

dat %>%
  filter(c(1,2)) %>%
  map(mean)

dat %>%
  keep(1,2) %>%
  map(mean)

dat %>%
  select(1,2) %>%
  map(mean)

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Мы можем использовать `[` и сделать

dat %>% 
 .[c(1, 2)] %>%
 map(., mean)
#[[1]]
#[1] 2

#[[2]]
#[1] 5

Или определите псевдоним так, как это делает пакет magrittr

extract <- `[` # literally the same as magrittr::extract
dat %>% 
  extract(c(1, 2)) %>% 
  map(., mean)

Что также может быть записано как

dat %>% `[`(c(1,2))

благодаря @ Moody_Mudskipper

0 голосов
/ 08 мая 2019

Опция

library(tidyverse)
keep(dat, seq_along(dat) %in% 1:2) %>% 
            map(mean)
#[[1]]
#[1] 2

#[[2]]
#[1] 5

или map с pluck

map(1:2, ~ pluck(dat, .x) %>% 
               mean)

Или с assign_in

assign_in(dat, 3, NULL) %>% 
      map(mean)

Или другой вариант map_if

map_if(dat, is.numeric, mean, .else = ~ NULL) %>% 
         discard(is.null)

или с discard

discard(dat, is.character) %>% 
        map(mean)

или с Filter и map

Filter(is.numeric, dat) %>% 
     map(mean)

ПРИМЕЧАНИЕ. Все они получают ожидаемый результат.

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