【问题标题】:"Error in mutate_impl(.data, dots)" when using purrr::accumulate, "column can't be converted from numeric to list"使用 purrr::accumulate 时出现“mutate_impl(.data, dots) 中的错误”,“无法将列从数字转换为列表”
【发布时间】:2019-05-22 15:19:51
【问题描述】:

我想在我的数据框中添加一列 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

为什么会这样?

【问题讨论】:

  • 在第二种情况下,你没有任何重复的'id',即。频率都是1
  • @akrun 几乎的频率都是1; ID 89016 出现两次
  • 我认为问题在于创建的不均匀结构(list vs vector` 当大部分频率计数为 1 时
  • 您可以包裹在listdf %&gt;% dplyr::group_by(id) %&gt;% dplyr::mutate(valueList= list(purrr::accumulate(value,c))) 中,或者检查元素是否为list,然后进行不同的处理
  • 肯定和上面第一种情况下想要的结果不一样@akrun

标签: r dplyr tidyverse purrr


【解决方案1】:

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

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

【讨论】:

  • 没有as.list更简单地实现同样的事情
猜你喜欢
  • 2018-06-29
  • 1970-01-01
  • 2018-06-02
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-20
相关资源
最近更新 更多