2017-11-30 14 views
3

데이터 프레임에 날짜 열이 있습니다. 각 날짜는 일반적으로 두 번 반복됩니다. 여기에 다른 컬럼에서 일부 스포츠 팀의 이름을 가지고 내 dataframe의 예입니다날짜 열을 R에서 1부터 시작하는 고유 일련 번호로 매핑하십시오.

dput(mydf) 
structure(list(date_game = structure(c(15643, 15643, 15643, 15644, 
15644, 15644, 15646, 15646), class = "Date"), team_id = c("WAS", 
"CLE", "LAL", "SAC", "CHI", "DET", "BOS", "MIL"), fran_id = c("Wizards", 
"Cavaliers", "Lakers", "Kings", "Bulls", "Pistons", "Celtics", 
"Bucks")), .Names = c("date_game", "team_id", "fran_id"), row.names = c(1L, 
2L, 3L, 7L, 8L, 9L, 29L, 30L), class = "data.frame") 

이 경우, mydf 3 고유의 날짜를 가지고 있으며,뿐만 아니라 날짜를 건너 뜁니다. 내 전체 데이터 프레임에는 수백 개의 고유 한 날짜가 있습니다. 이 예를 들어, 나는 다음과 같을 것이라고는 dataframe (를 date_number 전화)에 새 열을 추가에 관심이 : 제목처럼

mydf 
    date_game team_id fran_id date_number 
1 2012-10-30  WAS Wizards   1 
2 2012-10-30  CLE Cavaliers   1 
3 2012-10-30  LAL Lakers   1 
7 2012-10-31  SAC  Kings   2 
8 2012-10-31  CHI  Bulls   2 
9 2012-10-31  DET Pistons   2 
29 2012-11-02  BOS Celtics   3 
30 2012-11-02  MIL  Bucks   3 

말한다 - date_number 열에서 1로 시작, 내가 좋아하는 것 날짜에 대한 순차적 인 숫자가 증가합니다. 이 핵심 부분은 특정 날짜가 누락 된 경우에도 열이 순차적이라는 것입니다. 11-01은 없지만 11-02는 여전히 4가 아니라 3으로 설정됩니다.

이 작업을 수행하는 방법에 대한 의견은 매우 높이 평가됩니다.

답변

1

당신은 사용할 수 있습니다

mydf$date_number = as.integer(as.factor(mydf$date_game)) 
+0

가장 단순하기 때문에이 대답에 찬성표를 썼습니다. 가장 가치있는 것이지만 다른 대답도 좋았습니다. – Canovice

1

당신은 data.table에서 rleid으로이 작업을 수행 할 수 있습니다

library(data.table) 

setDT(df)[, date_number := rleid(date_game)] 

결과 : @ 마이크 H.에 의해 언급 한 바와 같이

> df 
    date_game team_id fran_id date_number 
1: 2012-10-30  WAS Wizards   1 
2: 2012-10-30  CLE Cavaliers   1 
3: 2012-10-30  LAL Lakers   1 
4: 2012-10-31  SAC  Kings   2 
5: 2012-10-31  CHI  Bulls   2 
6: 2012-10-31  DET Pistons   2 
7: 2012-11-02  BOS Celtics   3 
8: 2012-11-02  MIL  Bucks   3 

, 당신은 또한 단지 않고 data.table에서 rleid 기능을 훔칠 수 변환 df :

df$date_numbers <- data.table::rleid(df$date_game) 

자료 R과 또 다른 옵션 :

df$date_numbers <- rep(seq_along(unique(df$date_game)), 
         rle(as.integer(df$date_game))$lengths) 
+0

@MikeH. 사실, 어느 쪽이든 유효합니다. – useR

1

또 다른 약간 더 난해한 옵션 :

mydf$date_numbers <- cumsum(c(1, tail(!(mydf$date_game == lag(mydf$date_game)), - 1)))