2017-12-21 6 views
0

日付がいっぱいの巨大なデータフレームを取得しました。このように:特定の日付を指定する[R]

Date 
2014-01-02 
2014-01-02 
2014-01-02 
2014-01-03 
2014-01-03 
2014-02-01 
2014-02-01 
2014-02-02 
2014-02-02 

私は月に登場した日数を含む、余分な列を構築したいが(!データは、複数年のデータが含まれているので、より多くのそして1 Januaries、二月などがあります)。ちょうどこのように:

Date   Count 
2014-01-02  5 
2014-01-02  5 
2014-01-02  5 
2014-01-03  5 
2014-01-03  5 
2014-02-01  4 
2014-02-01  4 
2014-02-02  4 
2014-02-02  4 

私の解決策は悪いです。私はフィルタオプション(dplyrから)を使用して特定の月をフィルタリングし、それらを数えました。しかし、それは時間がかかり、自動的にこれを実行したいので、私はより持続可能なソリューションを探しています。

+0

異なる年から特定の月(1月など)をグループ化していますか?特定の年のデータしかありませんか? – AntoniosK

+0

私は何年ものデータを持っているので、私は別々に数えたいと思います。 –

+0

あなたのデータセットのより代表的な例を投稿する方がずっと良いでしょう。投稿されたソリューションを実際のデータセットに適用しようとすると、バグの数を最小限に抑えるために: – AntoniosK

答えて

1

を使用しているので:

d <- read.table(header=TRUE, stringsAsFactors = FALSE, text= 
"Date 
2014-01-02 
2014-01-02 
2014-01-02 
2014-01-03 
2014-01-03 
2014-02-01 
2014-02-01 
2014-02-02 
2014-02-02") 

d$count <- ave(!is.na(d$Date), substr(d$Date, 1,7), FUN=sum) 
d 

substr(d$Date, 1,7)d$Date内の文字列から最初の7つの文字(すなわち部分とを抽出し、年月、例:2014-01)。結果はここave()

にグループ化するために使用されているdata.tableとソリューションです:

library("data.table") 
D <- fread(
"Date 
2014-01-02 
2014-01-02 
2014-01-02 
2014-01-03 
2014-01-03 
2014-02-01 
2014-02-01 
2014-02-02 
2014-02-02") 

D[, count:=.N, substr(Date, 1, 7)] 
D 
+0

パーフェクト、それは働いた。しかし、あなたは1,7の部分で何をしているのか説明できますか? –

+0

私は自分の答えを編集しました。 'substr()'のドキュメントも読んでください。つまり 'help(" substr ")' – jogo

1

あなたはすでにあなたがベースRで行うことができますdplyr ...

df <- read.table(text = "Date 
2014-01-02 
       2014-01-02 
       2014-01-02 
       2014-01-03 
       2014-01-03 
       2014-02-01 
       2014-02-01 
       2014-02-02 
       2014-02-02", header = T) 
df 

library(dplyr) 
df %>% 
    group_by(ym = format(as.Date(Date, "%Y-%m-%d"), "%Y-%m")) %>% 
    mutate(Count = n()) %>% 
    ungroup() %>% 
    select(-ym) 
1

あなたがカウントするように私には、アカウントに毎月の年を取るために、あなたの投稿の例を変更しましたそれらは、個別に(あなたのコメントで指定された):あなたがPOSIXlt形式であなたの日付を持っている場合は

df = read.table(text = " 
Date 
2014-01-02 
2014-01-02 
2014-01-02 
2014-01-03 
2015-01-03 
2014-02-01 
2014-02-01 
2014-02-02 
2015-02-02", 
header=T) 

library(lubridate) 
library(dplyr) 

df %>% 
    mutate(Date = ymd(Date)) %>%  # update to a datetime variable (if needed) 
    group_by(Month = month(Date), # for each month and year 
      Year = year(Date)) %>% 
    mutate(N = n()) %>%    # count number of rows/appearances 
    ungroup() %>%     # forget the grouping 
    select(-Month, -Year)   # remove help variables 

# # A tibble: 9 x 2 
#   Date  N 
#  <date> <int> 
# 1 2014-01-02  4 
# 2 2014-01-02  4 
# 3 2014-01-02  4 
# 4 2014-01-03  4 
# 5 2015-01-03  1 
# 6 2014-02-01  3 
# 7 2014-02-01  3 
# 8 2014-02-02  3 
# 9 2015-02-02  1 
+1

私は2つの変数、すなわち年と月の作成を避けることができると思います。 group_byに 'group = format(Date、"%Y-%m ")'のようなものを書くことができます。これは、グループ化変数の一意のレベルを作成するのに十分です。 – jazzurro

+1

それは正しいです。 2つの変数を1つの文字列に貼り付けることもできます。私は、年を考慮しないことを決定し、変数の1つ(例えば、月)だけでグループ分けすることができる場合には、それ以上の処理について常に考える。 – AntoniosK

2

、月が組み込まれていて、あなただけの参照にテーブルを作ることができます。

Date = as.POSIXlt(c('2014-01-02', 
'2014-01-02', 
'2014-01-02', 
'2014-01-03', 
'2014-01-03', 
'2014-02-01', 
'2014-02-01', 
'2014-02-02', 
'2014-02-02')) 

table(Date$mon)[as.character(Date$mon)] 
0 0 0 0 0 1 1 1 1 
5 5 5 5 5 4 4 4 4 

0/1行は単に列名です。 POSIXでは1月が0月、2月が1月など

関連する問題