我需要创建一个新变量,其中包含每个 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
我该怎么做?谢谢!
最佳答案
我们可以使用 dplyr
和 zoo
中的函数。 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/