Как использовать dplyr mutate для создания новых столбцов путем ввода одного столбца в функцию, которая возвращает список? - PullRequest
2 голосов
/ 24 апреля 2020

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

Мой пример:

library(dplyr)

my_df <- data_frame(filename = c("file1","file2","file3","file4"),
                    digits_only = c("10101010", "11011011", "10011000","11111111"))

compress_it_list <- function(txt) {
  len.raw <- sum(nchar(txt))
  len.xz <- length(memCompress(txt, "x"))
  len.gz <- length(memCompress(txt, "g"))
  len.bz2 <- length(memCompress(txt, "b"))
  return(list("len_raw" = len.raw, 
              "len_xz" = len.xz, 
              "len_gz" = len.gz, 
              "len_bz2" = len.bz2, 
              "min_compression" = min(c(len.raw, len.xz, len.gz, len.bz2))))
}

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

compress_it_df <- function(txt) {
  len.raw <- sum(nchar(txt))
  len.xz <- length(memCompress(txt, "x"))
  len.gz <- length(memCompress(txt, "g"))
  len.bz2 <- length(memCompress(txt, "b"))
  return(data_frame("len_raw" = len.raw, 
                    "len_xz" = len.xz, 
                    "len_gz" = len.gz, 
                    "len_bz2" = len.bz2, 
                    "min_compression" = min(c(len.raw, len.xz, len.gz, len.bz2))))
}

Я пытался выяснить что-то в духе

new_df <- my_df %>%
  mutate_at(.vars = digits_only, .funs = compress_it_list)

1 Ответ

1 голос
/ 24 апреля 2020

Здесь у нас есть опция unnest_wider

library(dplyr)
library(tidyr)
library(purrr)
my_df %>%
      mutate(new = map(digits_only, compress_it_list)) %>% 
      unnest_wider(c(new))
# A tibble: 4 x 7
#  filename digits_only len_raw len_xz len_gz len_bz2 min_compression
#  <chr>    <chr>         <int>  <int>  <int>   <int>           <int>
#1 file1    10101010          8     60     12      39               8
#2 file2    11011011          8     60     13      39               8
#3 file3    10011000          8     60     16      39               8
#4 file4    11111111          8     64     11      39               8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...