2015-01-29 5 views
0

하나의 열의 순환 값을 기준으로 그룹화해야하는 일일 데이터 집합이 있습니다. 그룹화 식별자가 포함 된 다른 열을 추가하고 싶습니다. 예를 들어 내가 데이터열의 순환 값을 사용하여 R의 시계열 데이터 그룹화

나는이 같은 DAS의 값에 따라 그룹화 포함하는 다른 열을 추가 할
YEAR = c(1900, 1900, 1900, 1901,1901, 1901, 1901, 1902, 1902, 1902, 1903) 
CS = c("SUM", "SUM", "SUM", "SUM", "SPR", "SPR", "SPR", "SPR", "SPR", "SPR", "SPR") 
DAS = c(1, 2, 3, 4, 1, 2, 3,1, 2, 3, 4) 


mydt <- data.table (YEAR, CS, DAS) 

    YEAR CS DAS 
1: 1900 SUM 1 
2: 1900 SUM 2 
3: 1900 SUM 3 
4: 1901 SUM 4 
5: 1901 SPR 1 
6: 1901 SPR 2 
7: 1901 SPR 3 
8: 1902 SPR 1 
9: 1902 SPR 2 
10: 1902 SPR 3 
11: 1903 SPR 4 

의 설정 : 분명히

YEAR CS DAS  GRP 
1: 1900 SUM 1 1900SUM 
2: 1900 SUM 2 1900SUM 
3: 1900 SUM 3 1900SUM 
4: 1901 SUM 4 1900SUM 
5: 1901 SPR 1 1901SPR 
6: 1901 SPR 2 1901SPR 
7: 1901 SPR 3 1901SPR 
8: 1902 SPR 1 1902SPR 
9: 1902 SPR 2 1902SPR 
10: 1902 SPR 3 1902SPR 
11: 1903 SPR 4 1902SPR 

를, GRP는 년의 단지 연결입니다 및 CS, 비록 어떤 식별자, 말하길 그룹 번호, 할 것입니다. 그룹화는 DAS의 값이 나는이 작업을 수행하기 위해 루프를 사용 1.을 반환 할 때를 기반으로하고 그것을 잘

group <- function(df) { 
    for (i in 1: nrow(df)) { 
     if (df$DAS[i]== 1) { 
      nval<- paste0(df$YEAR[i], df$CS[i]) 
     } 
     df$GRP[i] <- nval 
    } 
    df 
} 

일 내 문제는 수백만 개의 행의 부부와 함께 사용하면 매우 느리다입니다. 훨씬 빠른 방법으로 그것을 성취 할 수있는 방법이 있습니까?

colemand77에 의해 지적, 그룹화가 완전히 년과 CS의 조합을 기반으로하지 않습니다 UPDATE, 오히려 년 CS의 값이 때 1. 경우가있다하는 DAS의 값이 반환 할 때를 기반으로 다르지만 그들은 여전히 ​​DAS의 동일한주기에 속해 있으므로 한 그룹에 속합니다.

+1

데이터 테이블이 자동으로 빨리 표시되지 않습니다. 소개 및 참조 의미 vignettes [여기] (https://github.com/Rdatatable/data.table/issues/944)를 검토하십시오. 당신이 찾고있는 것은'mydt [, GRP : = .GRP, by = c ("YEAR", "CS")]'-'.GRP'는 특별한 inbuilt 변수입니다. – Arun

+0

업데이트 된 코멘트가 ... 그룹 변경시기를 결정하는 로직 (날짜 등)이 있습니까? 아니면 DAS가 1로 돌아가고 있습니까? DAS는 항상 동일한 순서입니까? 항상 1 : 4 또는 때때로 1 : 5 등? – colemand77

+0

DAS는 항상 1에서 n까지의 양의 정수 시퀀스입니다. 따라서 n은 양의 정수가 될 수 있습니다. 내 데이터에서 한주기는 파종에서 수확까지 한 번의 수확에 해당합니다. DAS는 실제로 1 일 (파종)부터 시작하여 작물이 죽거나 수확 될 때 종료합니다. 불행히도 작물은 12 월에 시작하여 다음 해 5 월에 수확 할 수 있습니다. 몇 년 동안의 일일 데이터는 하나의 긴 시간대에 버려집니다. YEAR와 Cropping Season은 좋은 그룹화 변수가 아닙니다. 제 생각에는 데이터를 그룹화하는 유일한 방법은 DAS가 1로 돌아갈 때입니다. – User9999

답변

0

그래서, 단지 아룬의 답변을 강조 :

mydt[, GRP := .GRP, by=c("YEAR", "CS")] 

뿐만 아니라 당신이 말한대로 위에 GRP는 YEARCS의 연결이 아니라고 ... 그 다음 단지 잘못 인쇄의 경우 지적 Arun의 코멘트가 정확한 것입니다. 그렇지 않다면, Arun의 대답이 예기치 않은 결과를 줄 것이라고 생각하면 다시 말해야 할 것입니다.

다음을 시도해보고 시간을 정하십시오. ifelse는 가능한 한 빨리 빠르지 않을 수도 있지만, 내가 할 수있는 가장 빠른 방법으로. 느린 경우 알려 주시면 다시 해시합니다.

mydt[DAS == 1,GRP := .GRP, by = DAS][,GRP2 := cumsum(ifelse(is.na(GRP),0,GRP))] 
+0

답장을 보내 주신 Arun과 colemand77에게 감사드립니다. 예를 들어 GRP의 가치는 DAS가 1 일 때 Year와 CS의 값을 연결 한 것입니다. YEAR 및 CS의 값과 관계없이 DAS가 DAS가 1보다 작을 때 DAS가 다시 1 값. – User9999

+0

아! 그것은 흥미로운 질문입니다. 나는 전에 이것에 빠지지 않았으므로 그것에 대해 생각하게하고 다시 연락 할 것입니다. – colemand77

+0

@ User9999 - 위 내용을 살펴보고 성능이 향상되는지 알려주세요. – colemand77

관련 문제