如何将日期格式(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
或使用 year
从 library(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
而没有实际提供完整数据,但无论如何这种方法对我来说似乎更好。
我有一个 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
或使用 year
从 library(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
而没有实际提供完整数据,但无论如何这种方法对我来说似乎更好。