2017-08-03 5 views
0

開始日と終了日を使用して時間の経過とともにサブスクライバの頻度をプロットしたいと考えています。開始日と終了日をRで指定しているユーザをプロットする

私はサブスクライバごとに1日ごとに行を作成し、次に1日の頻度を計算してから1日ごとに頻度をプロットする方法があります。

これは小さなデータでは問題ありませんが、顧客あたりの行のステップが大きすぎるため、大きな加入者番号に対応できません。

効率的な方法はありますか?助けてくれてありがとうございました。

library(ggplot2) 
library(dplyr) 

# create dummy dataset 
subscribers <- data.frame(id = seq(1:10), 
    start = sample(seq(as.Date('2016/01/01'), as.Date('2016/06/01'), by="day"), 10), 
    end = sample(seq(as.Date('2017/01/01'), as.Date('2017/06/01'), by="day"), 10)) 

# creates a row for each day per user - OK for small datasets, but not scalable 
date_map <- Map(seq, subscribers$start, subscribers$end, by = "day") 
date_rows <- data.frame(
    org  = rep.int(subscribers$id, vapply(date_map, length, 1L)), 
    date = do.call(c, date_map)) 

# finds the frequency of users for each day 
date_rows %>% 
    group_by(date) %>% 
    dplyr::summarise(users = n()) -> plot_data 

ggplot(data = plot_data, 
     aes(x = date, y = users)) + 
    geom_line(size = 1.2,alpha = .6) 

Line plot of subscribers over time

答えて

1

これはどうですか?

library(tidyverse) 
df <- subscribers %>% 
    gather(key, value, start, end) %>% 
    mutate(key = ifelse(key == "start",1,-1)) %>% 
    arrange(value) 

df$cum <- cumsum(df$key) 

ggplot(data = df, 
     aes(x = value, y = cum)) + 
    geom_step() 
+0

大変感謝しています。どのように働いているのか分かりませんでしたが、今理解していると思います。これは確かに非常に大きなデータセットで実行されます。 – Murray

関連する問題