【问题标题】:How many times does an id appear in date range [r]一个 id 在日期范围内出现了多少次 [r]
【发布时间】:2017-04-10 16:31:50
【问题描述】:

我查看了herehere 的答案,但我还没有得到总结我的数据框所需的东西。我认为this answer 最接近我的需要。

我想查看客户在特定月份订购的次数,以及该月内出现了多少唯一 ID。 “id”是唯一的客户端id,“date”是事务发生的时间。

数据如下所示:

样本数据:

id   date
1    3/12/2016
2    3/14/2016
3    3/11/2016
1    4/19/2016
1    4/21/2016
3    5/21/2016
2    6/7/2016
1    6/8/2016

而我想要的结果是:

结果:

date     percent  
03-2016  100%
04-2016  33%
05-2016  33%
06-2016  66%

供参考:

length(unique(df$id)) = 3

关于我应该做什么的建议?

【问题讨论】:

    标签: r date


    【解决方案1】:

    我们可以使用by 并创建一个特定的TimePeriod 列:

    dat$date <- as.Date(dat$date, '%m/%d/%Y')
    dat$TimePeriod <- paste(format(dat$date, '%Y'),'-',format(dat$date, '%m'))
    
    unique_id <- length(unique(dat$id))
    
    setNames(stack(
      by(dat, dat$TimePeriod, function(x) length(unique(x$id)) / unique_id)
      ), c('percent', 'date'))
    
        percent      date
    1 1.0000000 2016 - 03
    2 0.3333333 2016 - 04
    3 0.3333333 2016 - 05
    4 0.6666667 2016 - 06
    

    数据

    dat <- read.table(text = 'id   date
    1    3/12/2016
                      2    3/14/2016
                      3    3/11/2016
                      1    4/19/2016
                      1    4/21/2016
                      3    5/21/2016
                      2    6/7/2016
                      1    6/8/2016', header = TRUE, stringsAsFactors = FALSE)
    

    【讨论】:

    • 我猜data.table 版本可能是这样的:as.data.table(mydf)[, date := as.IDate(date, format = "%m/%d/%Y")][, list(pct = length(unique(id))/unique_id), .(mon_yr = sprintf("%02d-%s", month(date), year(date)))]。 +1
    • @A5C1D2H2I1M1N2O1R2T1 :舍入到最近的月份,而不是 sprintf 您可以使用 data.table 的优点之一:[...] .(mon_yr = round(date, 'month')) [...]
    • @Jealie,好电话!谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-10-22
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多