Ошибка Mutate при применении Purrr :: Map для сгруппированных данных - PullRequest
0 голосов
/ 17 января 2019

Привет. Я пытаюсь применить очень простую функцию, используя purrr::map, однако я получаю сообщение об ошибке Error in mutate_impl(.data, dots) : Evaluation error: unused argument (.x[[i]]).

Коды указаны ниже:

data = data.frame(name = c('A', 'B', 'C'), metric = c(0.29, 0.39,0.89))
get_sample_size = function(metric, threshold = 0.01){

  sample_size =  ceiling((1.96^2)*(metric*(1-metric))/(threshold^2))
  return(data.frame(sample_size))
}
data %>% group_by(name) %>% tidyr::nest() %>% 
  dplyr::mutate(result = purrr::map( .x = data, .f = get_sample_size,  metric = metric, threshold = 0.01 ))

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Когда вы передаете metric в ... часть map, не ясно, что это столбец во вложенном фрейме данных.Но как только вы вложите данные, как вы сделали, metric - это не столбец в data, это столбец во вложенном фрейме ... также называемый «данными».(Это хороший пример того, почему вам нужны более конкретные имена переменных между прочим.)

Если вы отображаете столбец data, вы можете использовать $metric, чтобы указать на этот столбец, либо в письменной форме.функции, как я сделал здесь (например, df$metric), или в нотации формул (например, .$metric).

Как сказал @www, вам не нужны вложенные фреймы данных вэтот случай.Но в более сложном случае вам могут понадобиться вложенные фреймы данных, например, для построения моделей, поэтому полезно знать, как ссылаться именно на те данные, которые вам нужны.

library(tidyverse)

data %>% 
  group_by(name) %>% 
  tidyr::nest() %>%
  mutate(result = map(data, function(df) {
    get_sample_size(metric = df$metric, threshold = 0.01)
  }))
#> # A tibble: 3 x 3
#>   name  data             result              
#>   <fct> <list>           <list>              
#> 1 A     <tibble [1 × 1]> <data.frame [1 × 1]>
#> 2 B     <tibble [1 × 1]> <data.frame [1 × 1]>
#> 3 C     <tibble [1 × 1]> <data.frame [1 × 1]>

Созданона 2019-01-16 представьте пакет (v0.2.1)

0 голосов
/ 17 января 2019

Вам не нужно nest.Аргумент metric из функции get_sample_size должен быть числовым вектором, но если вы сделаете nest, столбец data будет списком фрейма данных, который не может быть вводом для аргумента metric.

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

library(tidyverse)

data %>% 
  group_by(name) %>% 
  summarize(result = purrr::map(.x = metric, 
                                .f = get_sample_size,  
                                threshold = 0.01))
# # A tibble: 3 x 2
#   name  result              
#   <fct> <list>              
# 1 A     <data.frame [1 x 1]>
# 2 B     <data.frame [1 x 1]>
# 3 C     <data.frame [1 x 1]>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...