新手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
-Justin
答案 0 :(得分:2)
如果您的数据框为df
:
df$date <- as.Date(df$date, format="%d-%b-%y")
df = df[order(df$id, df$date),]
df$Category = c("Early", "Late")
答案 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)
答案 2 :(得分:0)
我可能会考虑使用“data.table”包。
我将使用的一般方法是使用order
或rank
来创建“类别”列。这里很不错的是,通过比较两个日期,你并没有真正受到限制。
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")