2016-05-27 43 views
2

我是新來的R和具有用戶名的以下數據和產品(截斷輸出)的使用日期:如何計算日期之間的差值R中的每一個唯一的ID

Name, Date 
Jane, 01-24-2016 10:02:00 
Mary, 01-01-2016 12:18:00 
Mary, 01-01-2016 13:18:00 
Mary, 01-02-2016 13:18:00 
Jane, 01-23-2016 10:02:00 

我會喜歡對Date之間的差異進行一些分析,特別是每個用戶的使用時間之間的天數。我想繪製直方圖來確定用戶之間是否存在模式。

  1. 如何計算R中每個用戶的日期差異?
  2. 除了我應該探索的直方圖之外,還有其他可視化嗎?

感謝

+0

你能證明你的預期輸出(至少是數據),以及你在上面給出的數據中使用了什麼順序? –

回答

2

試試這個,假設你的數據幀df

## in case you have different column names 
colnames(df) <- c("Name", "Date") 

## you might also have Date as factors when reading in data 
## the following ensures it is character string 
df$Date <- as.character(df$Date) 

## convert to Date object 
## see ?strptime for various available format 
## see ?as.Date for Date object 
df$Date <- as.Date(df$Date, format = "%m-%d-%Y %H:%M:%S") 

## reorder, so that date are ascending (see Jane) 
## this is necessary, otherwise negative number occur after differencing 
## see ?order on ordering 
df <- df[order(df$Name, df$Date), ] 

## take day lags per person 
## see ?diff for taking difference 
## see ?tapply for applying FUN on grouped data 
## as.integer() makes output clean 
## if unsure, compare with: lags <- with(df, tapply(Date, Name, FUN = diff)) 
lags <- with(df, tapply(Date, Name, FUN = function (x) as.integer(diff(x)))) 

爲您截斷的數據(以5行),我得到:

> lags 
$Jane 
[1] 1 

$Mary 
[1] 0 1 

lags是一個列表。如果你想得到簡的信息,請做lags$Jane。要獲得直方圖,請執行hist(lags$Jane)。此外,如果您只想爲所有客戶端生成直方圖,忽略個體差異,請使用hist(unlist(lags))unlist()將列表摺疊成單個向量。


評論:

  1. 關於你的很好的參考R,看到需求CRAN: R introadvanced R;
  2. 使用tapply多指標?也許你可以試試我使用paste首先構建的輔助索引;
  3. 呃,看起來我很快就使事情變得複雜得多,通過使用density和中心極限定理等來進行可視化。所以我刪除了我的其他答案。
+0

非常感謝李哲源的詳細解釋,很容易按照你的指示和提示查找功能 – user82383

+0

李哲元:如果我想要應用Diff函數的另一列「Id」我可以打電話tapply(日期,名稱,Id,Fun = ...)嗎?我想申請的功能,但在多列 – user82383

+0

對不起,我以前並不清楚。我希望能夠將Name和ID視爲一個組合。只有在名稱和ID相同的情況下才會有區別Tapply仍然是正確的功能嗎? – user82383

2

我們可以使用data.tablelubridate

library(lubridate) 
library(data.table) 
setDT(df1)[order(mdy_hms(Date)), .(Diff=as.integer(diff(as.Date(mdy_hms(Date))))), Name] 
# Name Diff 
#1: Mary 0 
#2: Mary 1 
#3: Jane 1 

如果有多個分組變量,即 「ID」,我們可以將其放置在by

setDT(df1)[order(mdy_hms(Date)), .(Diff=as.integer(diff(as.Date(mdy_hms(Date))))), 
             by = .(Name, ID)] 
相關問題