使用purrr :: accumulate时出现“ mutate_impl(.data,点)中的错误”,“列无法从数字转换为列表”

时间:2019-05-22 15:19:51

标签: r dplyr tidyverse purrr

我想在数据框中添加一列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 :(得分:0)

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()

假设之所以会这样,是因为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

但是我不确定为什么它能正确处理您的第一个示例。