Re: [問題] 依照區間切割資料並計算個數

看板R_Language作者 (天)時間9年前 (2016/01/06 19:11), 9年前編輯推噓6(603)
留言9則, 2人參與, 最新討論串2/2 (看更多)
我忘記在哪學到下面這招的,剛剛要找都找不到相關的文章~"~ 如果有誰還記得再麻煩告知我一下,謝謝。 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://www.ptt.cc/bbs/R_Language/M.1452078719.A.79C.html

01/07 10:17, , 1F
really useful method, thanks
01/07 10:17, 1F

01/07 12:33, , 2F
剛剛試著跑一下,發現結果與您的結果不太一樣
01/07 12:33, 2F

01/07 12:36, , 3F
id 2與3 第一筆的diff的值出現負數, 應該要為2才對?
01/07 12:36, 3F

01/07 12:42, , 4F
因為<1的關係, 導致在cumsum的時候沒有自動進位
01/07 12:42, 4F
不太懂你為什麼會出現負數 http://i.imgur.com/Lc4ynDh.png
確實應該是2才是正常的 我無法確認為何你的程式跟我的程式結果不一樣 你是用同一個資料,結果不同,還是不同資料,結果不同? DT(原始資料讀入後的data.table)的date是character還是integer都有可能造成問題... 這裡要注意的是date2的class一定要是date,不然會有一些問題產生就是。

01/07 13:12, , 5F

01/07 13:14, , 6F
應該要向您的結果一樣 但是我的group by似乎失去了作用
01/07 13:14, 6F

01/07 13:16, , 7F
版本plyr:1.8.3 dplyr:0.4.3 magrittr:1.5
01/07 13:16, 7F
版本都跟我一樣,不過照理來說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...

01/07 13:49, , 8F
OMG~ you're right, detach之後重load package就好了..
01/07 13:49, 8F
恩恩,這種事情常常不小心發生,要小心一點XD

01/07 16:40, , 9F
我自己在寫的時候 如果用完group了 會ungroup
01/07 16:40, 9F
我倒是滿少ungroup的,不過他這裡的錯誤是mask造成的(攤手 ※ 編輯: celestialgod (140.109.74.87), 01/07/2016 16:41:56
文章代碼(AID): #1MZFP_US (R_Language)
文章代碼(AID): #1MZFP_US (R_Language)