私は正しい答えの領域にいると感じていますが、私の一生の間、これを行う方法を理解することはできません。製品元帳にエントリを取得し、製品トランザクションの生涯月ごとに行/ケースがあるデータの形状を変更したいと思います。
注意として、これらの元帳エントリが取り消されたり返金されたりすることがあります(date_from> date_thruがあります)。以下のデータフレームに、新規購入と払い戻しの例があります。また、月ごとの経常収益(mrr)のみを考慮しているため、取引日は常に作成された月の最初になるように事前にクリーニングされています。
サンプルdf:
user <- c("1001", "1002")
line_item <- c("abc123", "def456")
date_from <- as.Date(c("2015-01-01", "2015-06-01"), "%Y-%m-%d")
date_thru <- as.Date(c("2015-04-01", "2014-12-01"), "%Y-%m-%d")
mrr <- c(2.22, -4.44)
df <- cbind.data.frame(user, line_item, date_from, date_thru, mrr)
出力:
user line_item date_from date_thru mrr
1 1001 abc123 2015-01-01 2015-04-01 2.22
2 1002 def456 2015-06-01 2014-12-01 -4.44
望ましい結果:
user line_item month mrr
1001 abc123 2015-01-01 2.22
1001 abc123 2015-02-01 2.22
1001 abc123 2015-03-01 2.22
1001 abc123 2015-04-01 2.22
1002 def456 2015-06-01 -4.44
1002 def456 2015-05-01 -4.44
1002 def456 2015-04-01 -4.44
1002 def456 2015-02-01 -4.44
1002 def456 2015-01-01 -4.44
1002 def456 2014-12-01 -4.44
のmonth
ような関数をベクトル化seq(date_from, date_thru, by="months")
し、結果のすべてのベクトルを上記のように1つのdfに再度結合して、新しい列を作成するにはどうすればよいですか?
私がしようとしてきたlapply
、dplyr::mutate
とseq
し、それらを一緒に正常に動作させることはできません。
前もって感謝します!
特別な力明らかにするだけtidyr
でcomplete
とfill
機能を
library(tidyverse)
df %>%
# turn into a long format to handle the dates as one variable
gather(key, date, date_from:date_thru) %>%
# group the dataframe to apply operations separately on each user
group_by(user) %>%
# now complete the dataset with the implicit dates within the range of dates
# Note the consideration of: date_from > date_to with 'min' and 'max'
complete(date = seq.Date(from = min(date),to = max(date),by = "month") ) %>%
#now fill in the missing 'mrr'
fill(mrr, line_item)
# A tibble: 11 x 5
# Groups: user [2]
user date line_item mrr key
<fct> <date> <fct> <dbl> <chr>
1 1001 2015-01-01 abc123 2.22 date_from
2 1001 2015-02-01 abc123 2.22 <NA>
3 1001 2015-03-01 abc123 2.22 <NA>
4 1001 2015-04-01 abc123 2.22 date_thru
5 1002 2014-12-01 def456 -4.44 date_thru
6 1002 2015-01-01 def456 -4.44 <NA>
7 1002 2015-02-01 def456 -4.44 <NA>
8 1002 2015-03-01 def456 -4.44 <NA>
9 1002 2015-04-01 def456 -4.44 <NA>
10 1002 2015-05-01 def456 -4.44 <NA>
11 1002 2015-06-01 def456 -4.44 date_from
key
変数を削除したい場合%>% select(-key)
は、fill
何らかの理由で保持したい場合でも、終了後に次を追加してください...
PS @ Gによる関数作成の巧妙なトリックが本当に気に入りました。グロタンディークsign
へのハンドルdate_from
>date_to
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加