r - 使用条件求 R 中的累积和

标签 r sum

我需要创建一个新变量,其中包含每个 ID 过去三年金额的总和。

如果没有三年的数据,则应显示“NA”。

举个例子:

ID YEAR   AMOUNT
1 2010      5
1 2011      2
1 2012      4
1 2013      1
1 2014      3
2 2013      4
2 2014      6
2 2015      9
3 2012      4
3 2013      7
3 2014      2
3 2015      3

结果应该是这样的:

ID YEAR AMOUNT THREE_YR
1 2010      5       NA
1 2011      2       NA
1 2012      4       11
1 2013      1        7
1 2014      3        8
2 2013      4       NA
2 2014      6       NA
2 2015      9       19
3 2012      4       NA
3 2013      7       NA
3 2014      2       13
3 2015      3       12

我该怎么做?谢谢!

最佳答案

我们可以使用 dplyrzoo 中的函数。 dt2 是最终输出。

# Create example data frame
dt <- read.table(text = "ID YEAR   AMOUNT
1 2010      5
                 1 2011      2
                 1 2012      4
                 1 2013      1
                 1 2014      3
                 2 2013      4
                 2 2014      6
                 2 2015      9
                 3 2012      4
                 3 2013      7
                 3 2014      2
                 3 2015      3",
                 header = TRUE, stringsAsFactors = FALSE)

# Load packages
library(dplyr)
library(zoo)

# Process the data
dt2 <- dt %>%
  group_by(ID) %>%
  mutate(THREE_YR = rollsum(AMOUNT, k = 3, fill = NA, align = "right"))

更新:少于 3 条记录的 ID 组。

OP询问如果ID只有一两行该怎么办。老实说,我没有找到解决这个问题的好方法。我唯一能想到的就是将原始数据帧分为两组,将 rollsum 应用于所有记录大于或等于 3 的组。之后,合并所有组。

# Create example data frame
dt <- read.table(text = "ID YEAR   AMOUNT
                 1 2010      5
                 1 2011      2
                 1 2012      4
                 1 2013      1
                 1 2014      3
                 2 2013      4
                 3 2012      4
                 3 2013      7
                 3 2014      2
                 3 2015      3",
                 header = TRUE, stringsAsFactors = FALSE)

# Load packages
library(dplyr)
library(zoo)

# Process the data
dt2 <- dt %>%
  group_by(ID) %>%
  filter(n() >= 3) %>%
  mutate(THREE_YR = rollsum(AMOUNT, k = 3, fill = NA, align = "right")) %>%
  bind_rows(dt %>% group_by(ID) %>% filter(n() < 3)) %>%
  arrange(ID, YEAR)

关于r - 使用条件求 R 中的累积和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45036451/

相关文章:

sum - 带索引变量的符号求和

vba - Excel VBA : How to sum only values larger than a specific value?

sql - 如何计算 Spark SQL 中占总数的百分比

mysql - SQL 分组平均值

使用插入符号训练函数的 R 随机森林交叉验证不会产生与手动完成时相同的准确性

python - Python中的卡方检验

r - 如何迭代逻辑谓词列表?

r - 捕获错误然后分支逻辑

r - 如何从 R 中的嵌套 for 循环创建向量?

关于sum()和tax的sql问题(MySQL 5.0.89)