purrr: ошибка при преобразовании вложенного списка в символьный вектор - PullRequest
0 голосов
/ 19 сентября 2019

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

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

library(tidyverse)

df <- tibble(episode = 1:30,
             day = rep(c("Mon", "Wed", "Fri"), 10),
             name = rep(c(
               "Moe", "Larry", "Curly", "Shemp", "extra"
             ), 6))

chr_dups <- as_mapper( ~ str_c(.x) %>%
                         str_remove_all("[c\\(\\)]"))

df %>%
  nest(episode, .key = "dups") %>%
  mutate(dup_num = map_dbl(dups, nrow),
         dup_rows = map_chr(dups, chr_dups))
#> Warning in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE):
#> argument is not an atomic vector; coercing

#> Warning in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE):
#> argument is not an atomic vector; coercing

#> Warning in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE):
#> argument is not an atomic vector; coercing

#> Warning in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE):
#> argument is not an atomic vector; coercing

#> Warning in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE):
#> argument is not an atomic vector; coercing

#> Warning in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE):
#> argument is not an atomic vector; coercing

#> Warning in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE):
#> argument is not an atomic vector; coercing

#> Warning in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE):
#> argument is not an atomic vector; coercing

#> Warning in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE):
#> argument is not an atomic vector; coercing

#> Warning in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE):
#> argument is not an atomic vector; coercing

#> Warning in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE):
#> argument is not an atomic vector; coercing

#> Warning in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE):
#> argument is not an atomic vector; coercing

#> Warning in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE):
#> argument is not an atomic vector; coercing

#> Warning in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE):
#> argument is not an atomic vector; coercing

#> Warning in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE):
#> argument is not an atomic vector; coercing
#> # A tibble: 15 x 5
#>    day   name  dups             dup_num dup_rows
#>    <chr> <chr> <list>             <dbl> <chr>   
#>  1 Mon   Moe   <tibble [2 x 1]>       2 1, 16   
#>  2 Wed   Larry <tibble [2 x 1]>       2 2, 17   
#>  3 Fri   Curly <tibble [2 x 1]>       2 3, 18   
#>  4 Mon   Shemp <tibble [2 x 1]>       2 4, 19   
#>  5 Wed   extra <tibble [2 x 1]>       2 5, 20   
#>  6 Fri   Moe   <tibble [2 x 1]>       2 6, 21   
#>  7 Mon   Larry <tibble [2 x 1]>       2 7, 22   
#>  8 Wed   Curly <tibble [2 x 1]>       2 8, 23   
#>  9 Fri   Shemp <tibble [2 x 1]>       2 9, 24   
#> 10 Mon   extra <tibble [2 x 1]>       2 10, 25  
#> 11 Wed   Moe   <tibble [2 x 1]>       2 11, 26  
#> 12 Fri   Larry <tibble [2 x 1]>       2 12, 27  
#> 13 Mon   Curly <tibble [2 x 1]>       2 13, 28  
#> 14 Wed   Shemp <tibble [2 x 1]>       2 14, 29  
#> 15 Fri   extra <tibble [2 x 1]>       2 15, 30

Создано в 2019-09-19 Представить пакет (v0.3.0)

Я почти уверен, что проблема в as_mapper().

Ниже представлен представитель с репрезентативными игрушечными данными.Тиббл описывает некоторые эпизоды из «Трех марионеток», день, когда начался этот эпизод, и персонаж, который был главным героем в этом эпизоде.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 19 сентября 2019

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

library(tidyverse)

df <- tibble(episode = 1:30,
             day = rep(c("Mon", "Wed", "Fri"), 10),
             name = rep(c(
               "Moe", "Larry", "Curly", "Shemp", "extra"
             ), 6))

df %>%
  group_by(day, name) %>%
  summarise(
    dup_num = n(),
    dup_rows = str_c(episode, collapse = ", ")
  )
#> # A tibble: 15 x 4
#> # Groups:   day [3]
#>    day   name  dup_num dup_rows
#>    <chr> <chr>   <int> <chr>   
#>  1 Fri   Curly       2 3, 18   
#>  2 Fri   extra       2 15, 30  
#>  3 Fri   Larry       2 12, 27  
#>  4 Fri   Moe         2 6, 21   
#>  5 Fri   Shemp       2 9, 24   
#>  6 Mon   Curly       2 13, 28  
#>  7 Mon   extra       2 10, 25  
#>  8 Mon   Larry       2 7, 22   
#>  9 Mon   Moe         2 1, 16   
#> 10 Mon   Shemp       2 4, 19   
#> 11 Wed   Curly       2 8, 23   
#> 12 Wed   extra       2 5, 20   
#> 13 Wed   Larry       2 2, 17   
#> 14 Wed   Moe         2 11, 26  
#> 15 Wed   Shemp       2 14, 29

Создано в 2019-09-19 с помощью пакета prex (v0.3.0)

2 голосов
/ 19 сентября 2019

Это предупреждение, потому что элементы list не являются атомарными, то есть это list из tibble, которые можно идентифицировать, если мы pull столбец

df %>%
  nest(dups = episode)  %>% 
  pull(dups)
#<list_of<tbl_df<episode:integer>>[15]>
#[[1]]
# A tibble: 2 x 1
#  episode
#    <int>
#1       1
#2      16

#[[2]]
# A tibble: 2 x 1
#  episode
3    <int>
#1       2
#2      17
# ...

ТакЭто list из tibble.либо мы можем извлечь столбец с помощью pull

, либо мы можем flatten его и применить функцию

library(purrr)
df %>%
   nest(dups = episode) %>%
   mutate(dup_num = map_dbl(dups, nrow), 
         dup_rows = map(dups, ~ flatten_int(.x) %>% 
                                     chr_dups))

ПРИМЕЧАНИЕ. Не ясно, почему применяется функция 'chr_dups'в столбце «эпизод», который является числовым.Преобразования также не имеют смысла


Если нам просто нужно paste элементы 'эпизода', сгруппированные по другим столбцам, base R однострочный подход будет

aggregate(episode~ day + name, df, toString)
#   day  name episode
#1  Fri Curly   3, 18
#2  Mon Curly  13, 28
#3  Wed Curly   8, 23
#4  Fri extra  15, 30
#5  Mon extra  10, 25
#6  Wed extra   5, 20
#7  Fri Larry  12, 27
#8  Mon Larry   7, 22
#9  Wed Larry   2, 17
#10 Fri   Moe   6, 21
#11 Mon   Moe   1, 16
#12 Wed   Moe  11, 26
#13 Fri Shemp   9, 24
#14 Mon Shemp   4, 19
#15 Wed Shemp  14, 29
0 голосов
/ 19 сентября 2019

Просто добавляю к другим постерам.Вам не нужно использовать purrr для достижения того, что вы хотите.База R сделает.

df <- df %>%
  nest(episode, .key = "dups") %>%
  mutate(dup_num = sapply(dups, nrow),
         dup_rows = sapply(dups, function(x) paste0(x$episode, collapse = ",")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...