2016-11-14 13 views
3

自分の週に基づいてデータにラベルを付けることを希望します。これが私のデータである。グループを週単位でグループ化するR

df2 <- structure(list(Order_Date = structure(c(16735, 16805, 16753, 
16830, 17075, 17009, 17085, 16740, 16891, 16750, 16820, 16849, 
16906, 16929, 16746, 16731, 16786, 16873, 16895, 16931), class = "Date")), .Names = "Order_Date", row.names = c(NA, 
-20L), class = "data.frame") 

と私は週(0番目の週、1番目の週と....)に基づいてラベルを付けしようとしましたが、私は週によってグループに自分のデータを願っ後で

そして、私はこれを試してみました:

# order by data 
library (dplyr) 
df2<- arrange(df2, Order_Date) 


# label them by week 
$df2$week <- cumsum(weekdays(df2$Order_Date) == "Friday") 

それは私に正しい結果が得られていないと私は

Order_Date week 
1 2015-10-27 0 
2 2016-01-05 0 
3 2015-11-14 0 
4 2016-01-30 0 
5 2016-10-01 0 
6 2016-07-27 0 
7 2016-10-11 0 
8 2015-11-01 0 
9 2016-03-31 0 
10 2015-11-11 0 
11 2016-01-20 0 
12 2016-02-18 0 
13 2016-04-15 1 
14 2016-05-08 1 
15 2015-11-07 1 
16 2015-10-23 2 
17 2015-12-17 2 
18 2016-03-13 2 
19 2016-04-04 2 
20 2016-05-10 2 
奇妙で、以下の出力を、持っている

理想的には、私はこの出力を有するたい:

Order_Date label 
1 2015-10-23 0 
2 2015-10-27 0 
3 2015-11-01 1 
4 2015-11-07 2 
5 2015-11-11 2 
6 2015-11-14 3 
7 2015-12-17 8 
8 2016-01-05 10 

行番号8は、10週の行番号1の後に発生するだけでなく、次のように生成する溶液は、これらのデータはしていない示す私の第二の代替であるため同じ週:

Order_Date label 
1 2015-10-23 0 
2 2015-10-27 0 
3 2015-11-01 1 
4 2015-11-07 2 
5 2015-11-11 2 
6 2015-11-14 3 
7 2015-12-17 4 
8 2016-01-05 5 
+0

あなたの予想される出力は何ですか? – akrun

+0

@akrun私は質問を更新しますが、まだ明らかでない場合は教えてください。 – MFR

+0

なぜあなたは 'cumsum(weekdays(df2 $ Order_Date)==" Friday ")'あなたに週番号を与えると思いますか?その列の日付の累積数は、金曜日(ただし、順序付けされておらず、毎日または週には適用されません。金曜日または2時をスキップするとどうなりますか?)にのみ表示されます。それは週番号とは関係がありません。 – smci

答えて

2

以下のコードは、データの最小週に対する現在の週を計算しています。 week2は、モジュラ算術を使用してコードをより簡潔にしていますが、lubridate機能を使用して、週番号が年と週の数値の直接計算と正確に一致するとは限りません。

library(dplyr) 
library(lubridate) 

df2 %>% mutate(week = (year(Order_Date) - year(min(Order_Date)))*52 + 
       week(Order_Date) - week(min(Order_Date)), 
       week2 = (as.numeric(Order_Date) %/% 7) - (as.numeric(min(Order_Date)) %/% 7)) %>% 
    arrange(Order_Date) 
Order_Date week week2 
1 2015-10-23 0  0 
2 2015-10-27 0  0 
3 2015-11-01 1  1 
4 2015-11-07 2  2 
5 2015-11-11 2  2 
6 2015-11-14 3  3 
7 2015-12-17 8  8 
8 2016-01-05 10 10 
9 2016-01-20 12 12 
10 2016-01-30 14 14 
11 2016-02-18 16 17 
12 2016-03-13 20 20 
13 2016-03-31 22 23 
14 2016-04-04 23 23 
15 2016-04-15 25 25 
16 2016-05-08 28 28 
17 2016-05-10 28 28 
18 2016-07-27 39 39 
19 2016-10-01 49 49 
20 2016-10-11 50 50 
+1

私は 'lubridate'パッケージの' week() 'も使うことができると思います。 – Aramis7d

+0

' lubridate'パッケージから 'week()'を使いました。 – eipi10

2

cut.Date?cut.Date参照)間隔の仕様をとります。

library(dplyr) 
df2 %>% 
    mutate(week = cut.Date(Order_Date, breaks = "1 week", labels = FALSE)) %>% 
    arrange(Order_Date) 

#> Order_Date week 
#> 1 2015-10-23 1 
#> 2 2015-10-27 2 
#> 3 2015-11-01 2 
#> 4 2015-11-07 3 
#> 5 2015-11-11 4 
#> 6 2015-11-14 4 
#> 7 2015-12-17 9 
#> 8 2016-01-05 12 
#> 9 2016-01-20 14 
#> 10 2016-01-30 15 
#> 11 2016-02-18 18 
#> 12 2016-03-13 21 
#> 13 2016-03-31 24 
#> 14 2016-04-04 25 
#> 15 2016-04-15 26 
#> 16 2016-05-08 29 
#> 17 2016-05-10 30 
#> 18 2016-07-27 41 
#> 19 2016-10-01 50 
#> 20 2016-10-11 52 
+0

ありがとうございました。両方のソリューションは私にとって完璧に機能しました。 – MFR

0

はまた、あなたが日付を変換するISOweekパッケージを使用することができます。あなたはそれらの数週間を再命名する場合を除き、これは週の実際の数をカウントアップされますので、

あなたのデータは、一年カバーISOweek形式に変換し、それを出力のフィルタリングに使用します。パッケージを使用してISOweek

例コード:

library(ISOweek) 
x <- paste0(2000:2017, "-01-01") 
x <- as.Date(x) 
y <- ISOweek(x) 
print(y) 
関連する問題