2013-10-21 57 views
0

新手R用戶在這裏...我試圖比較每個ID的日期,並確定哪些條目更早或更晚。輸入數據會是這個樣子:在R數據框中比較行之間的日期

id date 
101 18-Sep-12 
101 21-Aug-12 
102 25-Mar-13 
102 15-Apr-13 

和輸出會是這個樣子:

id date   Category 
101 18-Sep-12 Late 
101 21-Aug-12 Early 
102 25-Mar-13 Early 
102 15-Apr-13 Late 

-Justin

+1

是否有每個'id'總是兩個條目? –

+0

是的,這個例子只有兩個 – user2900006

回答

2

如果數據幀是df

df$date <- as.Date(df$date, format="%d-%b-%y") 
df = df[order(df$id, df$date),] 
df$Category = c("Early", "Late") 
+0

是的,好的。 –

+0

+1 - 務實和簡潔的解決方案! –

2

您可以在這裏使用plyr

library(plyr) 
loc <- Sys.setlocale("LC_TIME", "ENGLISH") 
dat$date <- as.Date(dat$date, format = "%d-%b-%y") 
ddply(dat, .(id), transform, cat = ifelse(date == min(date), "EARLY", "LATE")) 
## id  date cat 
## 1 101 2012-09-18 LATE 
## 2 101 2012-08-21 EARLY 
## 3 102 2013-03-25 EARLY 
## 4 102 2013-04-15 LATE 
Sys.setlocale("LC_TIME", loc) 
+0

好的,這看起來不錯。設置當地時間的相關性是什麼? – user2900006

+0

@ user2900006由於%b格式與本地相關,因此我必須設置本地時間。我有一個法國本地人,我認爲你的情況不需要。我只是把它放在像我這樣的當地人身上...... – agstudy

0

我可能會考慮使用「data.table」包。

我會使用的一般方法是使用orderrank來創建您的「類別」列。這裏很好的事情是,你並沒有真正限制比較兩個日期。

DT <- data.table(df) 
DT[, category := order(date), by = id] 
DT 
#  id  date category 
# 1: 101 2012-09-18  2 
# 2: 101 2012-08-21  1 
# 3: 102 2013-03-25  1 
# 4: 102 2013-04-15  2 

如果你想要的文字標籤,你可以使用factor

DT[, category := factor(category, labels = c("Early", "Late"))] 
DT 
#  id  date category 
# 1: 101 2012-09-18  Late 
# 2: 101 2012-08-21 Early 
# 3: 102 2013-03-25 Early 
# 4: 102 2013-04-15  Late 

爲了方便,這是 「DF」,我開始:

df <- structure(list(id = c(101L, 101L, 102L, 102L), 
    date = structure(c(15601, 15573, 15789, 15810), class = "Date")), 
    .Names = c("id", "date"), row.names = c(NA, -4L), class = "data.frame")