2013-10-21 1 views
0

초보자 R 사용자 여기에 R의 dataframe의 행 사이에 날짜를 비교.내가 각 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 

스틴

+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"패키지를 사용으로 보일 것이다.

일반적인 접근 방법은 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") 
관련 문제