2

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

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 创建一个新的累积总和列(如下所示),但实际上我想创建一个“年度累积总和,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
4

2 回答 2

2

您可以手动执行此操作,但我会从中获取year函数,data.table然后直接在原始数据集上执行类似操作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没有实际提供完整数据的情况下进行了预定义,但无论如何这种方法对我来说似乎更好。

于 2015-10-25T15:41:54.783 回答
1

我们可以使用正则表达式提取“年份”,按其分组并使用summarise以获得所需的输出。从 OP 帖子中的“y”开始

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

或使用yearfromlibrary(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),获取sum'n',通过执行 'n' 创建一个新列 'N cumsum' .

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
于 2015-10-25T15:36:42.767 回答