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

またはyearfromを使用しlibrary(lubridate)て「年」を抽出し、 を使用します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)、「n」を取得しsum、「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 に答える