«Ошибка в mutate_impl (.data, dots)» при использовании purrr :: аккумулировать, «столбец не может быть преобразован из числа в список» - PullRequest
0 голосов
/ 22 мая 2019

Я хочу добавить столбец valueList к моему фрейму данных.Сгруппированный по id, он должен показать совокупный вектор value до этой точки.См. Пример ниже:

library(dplyr)
library(purrr)
df <- data.frame(id=c(1,2,3,4,5,6,7,8,1,2,3,3,2,3,5,6),
                 value=c(58,61,59,49,36,35,39,23,75,73,43,43,13,54,23,12))

df <- df %>% 
  dplyr::group_by(id) %>% 
  dplyr::mutate(valueList=purrr::accumulate(value,c)) %>% 
  ungroup()

Однако, когда я использую это с некоторыми другими значениями, я получаю ошибку согласно заголовку вопроса.См. Ниже:

df <- data.frame(id=c(56612,32323,96953,93074,15964,38483,11020,91474,62432,70463,89016,29826,85076,46258,18339,89016),
                 value=c(58,61,59,49,36,35,30,23,75,73,43,0,46,45,43,42))

df <- df %>% 
  dplyr::group_by(id) %>% 
  dplyr::mutate(valueList=purrr::accumulate(value,c)) %>% 
  ungroup()

Error in mutate_impl(.data, dots) : Column valueList can't be converted from numeric to list

Почему это происходит?

1 Ответ

0 голосов
/ 26 мая 2019

Вероятно, akrun имел в виду, что вы должны обернуть accumulate, чтобы убедиться, что он всегда возвращает список, потому что если вы выполните его на одном элементе, он просто возвращает этот элемент:

accumulate(c(1), c)
# [1] 1
accumulate(c(1, 2), c)
# [[1]]
# [1] 1

# [[2]]
# [1] 1 2

Вы можете сделать это с:

df %>% 
  dplyr::group_by(id) %>% 
  dplyr::mutate(valueList=as.list(purrr::accumulate(value, c))) %>% 
  ungroup()

I предположим , что это происходит, потому что dplyr, вероятно, ожидает, что структура результата будет совместимой во всех группах, проверьте, например:

bind_rows(tibble(a=list(1)),
          tibble(a=2))
# Error: Column `a` can't be converted from list to numeric
bind_rows(tibble(a=2),
          tibble(a=list(1)))
# Error: Column `a` can't be converted from numeric to list

Но я не уверен, почему он правильно обработал ваш первый пример.

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