Как рассчитать среднее / сумму отдельных столбцов столбца вложенного списка, используя функцию карты Мур - PullRequest
0 голосов
/ 05 октября 2019

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

library(tidyverse)
z <- tibble(name = c("Bill","Bill","Bill","Sue","Sue"), grade =c(90L,95L,70L,100L,98L), time=c(10L,11L,10L,15L,16L))

summary <- z %>% 
  group_by(name) %>% 
  nest %>% 
  mutate(n = map_int(data,nrow)) %>% 
  mutate(avg = map(data$grade,mean)) %>% 
  mutate(ttl_time = map(data$time, sum))

Когда я запускаю это, я получаю сообщение об ошибке :: Столбец y должен иметь длину 3 (количество строк) или одна, а не 2

Мой целевой вывод:

name      data     n      avg      ttl_time

Bill     [3x3]     3      92        31

Sue      [2x3]     2      99        31  

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

Я смотрел это студийное видео и считаю, что делаю то же самое, что видел в видео. Работа со столбцами списка

1 Ответ

0 голосов
/ 07 октября 2019
z %>% 
  group_by(name) %>% 
  nest() %>% 
  mutate(n = map_int(data, nrow),
         avg = map_dbl(data, ~ mean(.x$grade)),
         ttl_time = map_dbl(data, ~ sum(.x$time)))

# # A tibble: 2 x 5
#   name  data                 n   avg ttl_time
#   <chr> <list>           <int> <dbl>    <dbl>
# 1 Bill  <tibble [3 × 2]>     3    85       31
# 2 Sue   <tibble [2 × 2]>     2    99       31

Обозначение формулы с ~ является сокращением, например, для function(.x) mean(.x$grade)


Ошибка OP действительно связана с тем фактом, что map не может выполнять итерацию непосредственно для каждого элемента gradeиз списка data, по крайней мере, с этим синтаксисом.

data$grade понимается как элемент списка data с именем grade, и такого элемента не существует.

Этот альтернативный синтаксис может помочь понять, как это достижимо:

z %>% 
  group_by(name) %>% 
  nest() %>% 
  mutate(n = map_int(data, nrow),
         avg = map_dbl(map(data, "grade"), mean),
         ttl_time = map_dbl(map(data, "time"), sum))

, где map(data, "grade") извлекает каждый grade компонент из элементов столбца списка data.

Хотя это, на мой взгляд, менее читабельно, чем первое предложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...