如何指定cumsum操作的顺序?

时间:2018-01-02 20:24:18

标签: r

我有一个数据集counts.df数据框,其中包含一个县的保险公司数量以及该县的人口数量。我想添加一个专栏,给出居住在县里的累积人口,至少和保险公司一样多。

我可以先在counts.df上排序number.of.insurers然后应用cumsum来完成此操作:

counts.df<-counts.df[with(counts.df,order(-number.of.insurers)),]
counts.df$cum.pop<-cumsum(counts.df$pop)

这段代码感觉很脆弱,因为排序步骤可能会丢失,我实际上是在改变数据帧并依赖它的cumsum当前状态来工作,这感觉非常不合适。

我的问题是:是否有明确的方法告诉cumsum在不将数据框作为单独步骤排序的情况下使用什么顺序?

1 个答案:

答案 0 :(得分:2)

不。你需要排序。这是dplyr样式链可以使事情更清晰的情况:

counts.df %>% 
  arrange(-number.of.insurers) %>% 
  mutate(cumpop=cumsum(pop))

如果你真的想要,你可以编写自己的函数来进行排序和求和。但是没有内置的东西。

sortcumsum <- function(x, ordered_by=seq_along(x)) {
    idx <- order(ordered_by)
    cumsum(x[idx])[order(idx)]
}

并像

一样使用它
counts.df$cum.pop <- sortcumsum(counts.df$pop, -counts.df$number.of.insurers)