如何将日期格式(d.m.Y)更改为年份(Y)并找到年度累计总和?

How to change date format(d.m.Y) to year(Y) & find annual cumulative sum?

我有一个 2 列数据框 x,如下所示。 "Publication.Date" 列的格式为“%d.%m.%Y”。无论如何要从 "Publication.Date" 中创建一个格式为“%Y”的 "year" 的新列?

head(x,10)
   Publication.Date n
1        1979-09-05 1
2        1979-09-19 1
3        1980-03-19 1
4        1980-10-01 1
5        1980-12-10 1
6        1981-01-07 1
7        1981-04-02 1
8        1981-05-06 1
9        1981-11-18 1
10       1982-01-20 2

我尝试使用 dplyr 创建一个新的累积和列(如下所示),但实际上我想创建一个新的 "Annual cumulative sum, N" 列,即通过每年累加 "n"。

y <- mutate(x, N=cumsum(n))

head(y,10)
   Publication.Date n  N
1        1979-09-05 1  1
2        1979-09-19 1  2
3        1980-03-19 1  3
4        1980-10-01 1  4
5        1980-12-10 1  5
6        1981-01-07 1  6
7        1981-04-02 1  7
8        1981-05-06 1  8
9        1981-11-18 1  9
10       1982-01-20 2 11

我想要的结果应该如下所示。感谢您的任何建议。谢谢

         Year  n  N
1        1979  2  2
3        1980  3  5
6        1981  4  9
10       1982  2 11

我们可以使用正则表达式提取 'Year',按其分组,然后使用 summarise 获得所需的输出。从 'y' 从 OP 的 post

开始
y %>% 
   group_by(Year= sub('-.*', '', Publication.Date)) %>%
   summarise(n= sum(n), N= last(N))
#    Year     n     N
#   (chr) (int) (int)
#1  1979     2     2
#2  1980     3     5
#3  1981     4     9
#4  1982     2    11

或使用 yearlibrary(lubridate) 提取 'Year' 并使用 summarise.

library(lubridate)
y %>% 
   group_by(Year = year(as.Date(Publication.Date))) %>% 
   summarise(n= sum(n), N= last(N))
#    Year     n     N
#   (int) (int) (int)
#1  1979     2     2
#2  1980     3     5
#3  1981     4     9
#4  1982     2    11

如果我们使用 data.table,我们将初始数据集转换为 'data.table'(setDT(x),按 'Year' 分组(使用 year 提取) ,获取 'n' 的 sum,通过执行 'n' 的 cumsum 创建一个新列 'N'。

library(data.table)
setDT(x)[, list(n= sum(n)), .(Year= year(Publication.Date))][, N:= cumsum(n)][]
#   Year n  N
#1: 1979 2  2
#2: 1980 3  5
#3: 1981 4  9
#4: 1982 2 11

您可以手动执行此操作,但我会从 data.table 获取 year 函数,然后直接在您的原始数据集上执行类似操作 x

library(data.table)
x %>%
  group_by(Year = year(Publication.Date)) %>%
  tally() %>%
  mutate(N = cumsum(n))

# Source: local data frame [4 x 3]
# 
#    Year     n     N
#   (int) (int) (int)
# 1  1979     2     2
# 2  1980     3     5
# 3  1981     4     9
# 4  1982     2    11

尽管我会先不计算 n

x %>%
  count(Year = year(Publication.Date)) %>%
  mutate(N = cumsum(n))
# Source: local data frame [4 x 3]
# 
#    Year     n     N
#   (int) (int) (int)
# 1  1979     2     2
# 2  1980     3     5
# 3  1981     4     9
# 4  1982     1    10

但这并不完全匹配您想要的输出,因为您预定义了n而没有实际提供完整数据,但无论如何这种方法对我来说似乎更好。