0

新手 R 用户在这里...我正在尝试比较每个 id 的日期并确定哪个条目更早或更晚。输入数据看起来像这样:

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

-贾斯汀

4

3 回答 3

2

如果您的数据框是df

df$date <- as.Date(df$date, format="%d-%b-%y")
df = df[order(df$id, df$date),]
df$Category = c("Early", "Late")
于 2013-10-21T16:21:18.280 回答
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)
于 2013-10-21T16:46:57.107 回答
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")
于 2013-10-21T17:09:03.887 回答