Tidyverse purrr подход к добавлению элементов в список - PullRequest
0 голосов
/ 25 ноября 2018

Я ищу tidyverse / purrr подход для добавления элементов в список.Например:

library(tidyverse)

l <- list(c("a", "a", "b"), c("c", "d"), c("e", "f", "e", "g"))
l
[[1]]
[1] "a" "a" "b"

[[2]]
[1] "c" "d"

[[3]]
[1] "e" "f" "e" "g"

Как мне построить конвейер %>%, чтобы получить что-то вроде следующего:

desired <- list(
  list(vec = c("a", "a", "b"), length = 3, unique = 2),
  list(vec = c("c", "d"), length = 2, unique = 2),
  list(vec = c("e", "f", "e", "g"), length = 4, unique = 3)
)

desired
[[1]]
[[1]]$vec
[1] "a" "a" "b"

[[1]]$length
[1] 3

[[1]]$unique
[1] 2


[[2]]
[[2]]$vec
[1] "c" "d"

[[2]]$length
[1] 2

[[2]]$unique
[1] 2


[[3]]
[[3]]$vec
[1] "e" "f" "e" "g"

[[3]]$length
[1] 4

[[3]]$unique
[1] 3

Я знаю, что могу сопоставить отдельные функции, используя l %>% map(length) или l %>% map(unique), но я хотел бы добавить новые элементы в список и сделать это в одном конвейере.

1 Ответ

0 голосов
/ 25 ноября 2018
l <- list(c("a", "a", "b"), c("c", "d"), c("e", "f", "e", "g"))

Purr подход:

l %>% 
  map(~ list(vec = .,
             length = length(.),
             unique = length(unique(.))))

Вывод

[[1]]
[[1]]$`vec`
[1] "a" "a" "b"

[[1]]$length
[1] 3

[[1]]$unique
[1] 2


[[2]]
[[2]]$`vec`
[1] "c" "d"

[[2]]$length
[1] 2

[[2]]$unique
[1] 2


[[3]]
[[3]]$`vec`
[1] "e" "f" "e" "g"

[[3]]$length
[1] 4

[[3]]$unique
[1] 3

Однако я постараюсь придерживаться использования фреймов данных (тибблы), где это возможно:

l %>%
  tibble(vec = .) %>%
  mutate(length = map_dbl(vec, length),
         unique = map_dbl(vec, ~length(unique(.))))

Выход:

# A tibble: 3 x 3
  vec       length unique
  <list>     <dbl>  <dbl>
1 <chr [3]>      3      2
2 <chr [2]>      2      2
3 <chr [4]>      4      3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...