作者celestialgod (天)
看板R_Language
标题Re: [问题] 依照区间切割资料并计算个数
时间Wed Jan 6 19:11:55 2016
我忘记在哪学到下面这招的,刚刚要找都找不到相关的文章~"~
如果有谁还记得再麻烦告知我一下,谢谢。
19:34补充:
我找到了,是
#1KzOu2X8 (R_Language),他用matrix去创资料的方式很特别XD
所以後来脑海中有这个印象,不过跟这篇无关拉,只是一个小技巧而已
library(data.table)
library(plyr)
library(dplyr)
library(magrittr)
DT = fread('
id date
1 1204
1 1205
1 1209
1 1210
1 1211
2 1201
2 1202
2 1205
2 1207
3 1204
3 1206', header = TRUE, colClasses = c('integer', 'character'))
DT %>% mutate(date2 = gsub('(\\d{2})(\\d{2})', '2015-\\1-\\2', date) %>%
as.Date) %>% group_by(id) %>% arrange(id, date2) %>%
mutate(diffDay = diff(c(date2[1]-2, date2))) %>% ungroup %>%
mutate(num = cumsum(ifelse(diffDay > 1, 1L, 0L))) %>% select(id, date, num)
# Source: local data table [11 x 3]
#
# id date num
# (int) (chr) (int)
# 1 1 1204 1
# 2 1 1205 1
# 3 1 1209 2
# 4 1 1210 2
# 5 1 1211 2
# 6 2 1201 3
# 7 2 1202 3
# 8 2 1205 4
# 9 2 1207 5
# 10 3 1204 6
# 11 3 1206 7
PS: 2015是随便加的,有年放年,没年资料随便放一年
只要都在同一年就没问题,出来的天数就不会有问题
※ 引述《tHEiPHoNe ( )》之铭言:
: 有一组消费者资料
: id date
: 1 1204
: 1 1205
: 1 1209
: 1 1210
: 1 1211
: 2 1201
: 2 1202
: 2 1205
: 2 1207
: 3 1204
: 3 1206
: 若同一user不间断天数消费则计算为同一笔
: 不同user或是间断消费天数则计入下一笔
: 如下
: id date num
: 1 1204 1
: 1 1205 1
: 1 1209 2
: 1 1210 2
: 1 1211 2
: 2 1201 3
: 2 1202 3
: 2 1205 4
: 2 1207 5
: 3 1204 6
: 3 1206 7
: 想请问有建议使用的function吗?
: 谢谢
--
R资料整理套件系列文:
magrittr #1LhSWhpH (R_Language) http://tinyurl.com/1LhSWhpH
data.table #1LhW7Tvj (R_Language) http://tinyurl.com/1LhW7Tvj
dplyr(上) #1LhpJCfB (R_Language) http://tinyurl.com/1LhpJCfB
dplyr(下) #1Lhw8b-s (R_Language)
tidyr #1Liqls1R (R_Language) http://tinyurl.com/1Liqls1R
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 180.218.152.118
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1452078719.A.79C.html
1F:推 tHEiPHoNe: really useful method, thanks 01/07 10:17
2F:推 tHEiPHoNe: 刚刚试着跑一下,发现结果与您的结果不太一样 01/07 12:33
3F:→ tHEiPHoNe: id 2与3 第一笔的diff的值出现负数, 应该要为2才对? 01/07 12:36
4F:推 tHEiPHoNe: 因为<1的关系, 导致在cumsum的时候没有自动进位 01/07 12:42
不太懂你为什麽会出现负数
http://i.imgur.com/Lc4ynDh.png
确实应该是2才是正常的
我无法确认为何你的程式跟我的程式结果不一样
你是用同一个资料,结果不同,还是不同资料,结果不同?
DT(原始资料读入後的data.table)的date是character还是integer都有可能造成问题...
这里要注意的是date2的class一定要是date,不然会有一些问题产生就是。
6F:→ tHEiPHoNe: 应该要向您的结果一样 但是我的group by似乎失去了作用 01/07 13:14
7F:→ tHEiPHoNe: 版本plyr:1.8.3 dplyr:0.4.3 magrittr:1.5 01/07 13:16
版本都跟我一样,不过照理来说group_by後经过一个mutate
他的class应该会回到tbl_dt 而非grouped_dt
你的mutate看起来没有吃到group_by
我猜你是不是library(plyr);library(dplyr) 顺序弄反 mutate用到plyr的
一定要先library(plyr) 才能library(dplyr)
另外,问一下你的R版本? 我R版本还在3.2.2...
8F:推 tHEiPHoNe: OMG~ you're right, detach之後重load package就好了.. 01/07 13:49
恩恩,这种事情常常不小心发生,要小心一点XD
9F:推 memphis: 我自己在写的时候 如果用完group了 会ungroup 01/07 16:40
我倒是满少ungroup的,不过他这里的错误是mask造成的(摊手
※ 编辑: celestialgod (140.109.74.87), 01/07/2016 16:41:56