2013-10-21 33 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")