我想在数据框中添加一列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
为什么会这样?
答案 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
但是我不确定为什么它能正确处理您的第一个示例。