map_dbl со столбцом списка дает ошибку: результат 1 должен быть одинарным двойным, а не двойным вектором длины - PullRequest
0 голосов
/ 04 августа 2020
diamonds %>% 
  mutate(log_price = log(price)) %>% 
  group_by(cut) %>% 
  nest() %>% 
  mutate(scale_log = map_dbl(data, ~.x$log_price %>% scale %>% as.vector))

Желаемый результат - новая переменная scale_log, которая представляет собой просто вектор для каждой строки кадра данных. Приведенный выше код дает:

Ошибка: результат 1 должен быть одинарным двойным, а не двойным вектором длины 1610

Это работает, если я просто использую обычную карту:

x <- diamonds %>% 
  mutate(log_price = log(price)) %>% 
  group_by(cut) %>% 
  nest() %>% 
  mutate(scale_log = map(data, ~.x$log_price %>% scale %>% as.vector))

Но когда я это делаю, x $ scale_log представляет собой список, тогда как я хотел, чтобы он был просто вектором:

x %>% glimpse
Rows: 5
Columns: 3
Groups: cut [5]
$ cut       <ord> Ideal, Premium, Good, Very Good, Fair
$ data      <list> [<tbl_df[21551 x 11]>, <tbl_df[13791 x 11]>, <tbl_df[4906 x 11]>, <tbl_df[12082 x 11]>, <tbl_df[1610 x 11]>]
$ scale_log <list> [<-1.8668994653, -1.8245259872, -1.8127394789, -1.8010892338, -1.6532201679, -1.6532201679, -1.6532201679, -1.6507226822, -1.6507226822, -1…

Как я могу использовать map_dbl для получения желаемого результата?

1 Ответ

1 голос
/ 04 августа 2020

Не nest и не используйте какую-либо версию map, вы можете использовать комбинацию group_by + mutate.

library(dplyr)

diamonds %>% 
  mutate(log_price = log(price)) %>% 
  group_by(cut) %>% 
  mutate(scale_log = as.numeric(scale(log_price)))

Проблема с подходом map_dbl:

library(tidyr)
library(purrr)

diamonds %>% 
 mutate(log_price = log(price)) %>% 
 group_by(cut) %>% 
 nest()

# cut       data                  
#  <ord>     <list>                
#1 Ideal     <tibble [21,551 × 10]>
#2 Premium   <tibble [13,791 × 10]>
#3 Good      <tibble [4,906 × 10]> 
#4 Very Good <tibble [12,082 × 10]>
#5 Fair      <tibble [1,610 × 10]> 

Это 5-строчный фрейм данных, когда вы используете map_dbl, он возвращает вам значения, которые такие же, как nrow(diamonds), т.е. 53940. mutate ожидает, что на выходе будет такое же количество строк, то есть 5, следовательно, возникает ошибка.

Вы можете решить эту проблему, сохраняя данные в списке, используя map, а затем unnest.

diamonds %>% 
  mutate(log_price = log(price)) %>% 
  group_by(cut) %>% 
  nest() %>%
  summarise(scale_log = map(data, ~.x$log_price %>% scale %>% as.vector)) %>%
  unnest(scale_log)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...