2016-07-30 1 views
1

매년 두 그룹이 있는데, 첫 번째 그룹은 두 번째 그룹 위에 쌓입니다. 첫 번째 또는 두 번째 행 그룹을 나타내는 열을 추가하고 싶습니다. 이 예제의 그룹을 표시했으나 실제 데이터 집합에 필드가 나타나지 않습니다.누적 된 데이터 집합에 레이블 지정

year measure data ... 
1991  1 ... [group 1] 
1991  2  [group 1] 
1991  3  [group 1] 
1991  1  [group 2] 
1991  2  [group 2] 
1991  3  [group 2] 
1991  4  [group 2] 
1992  1  [group 1] 
1992  2  [group 1] 
1992  3  [group 1] 
1992  1  [group 2] 
1992  2  [group 2] 
1992  3  [group 2] 
1992  4  [group 2] 

답변

1

우리는 data.table, dplyr 또는 base R 중 하나의 방법으로 시도 할 수 있습니다. data.table을 사용하여 'data.frame'을 'data.table'(setDT(df1))로 'year'로 그룹화하고 'measure'의 인접 요소의 차이가 0보다 작 으면 누적 합계를 얻고 paste '그룹'을 사용하여 'grp'열을 만듭니다.

library(data.table) 
setDT(df1)[, grp := paste("group", cumsum(c(TRUE, diff(measure) < 0))), year] 
df1 
# year measure  grp 
#1: 1991  1 group 1 
#2: 1991  2 group 1 
#3: 1991  3 group 1 
#4: 1991  1 group 2 
#5: 1991  2 group 2 
#6: 1991  3 group 2 
#7: 1991  4 group 2 
#8: 1992  1 group 1 
#9: 1992  2 group 1 
#10:1992  3 group 1 
#11:1992  1 group 2 
#12:1992  2 group 2 
#13:1992  3 group 2 
#14:1992  4 group 2 

같은 방법이 정비사가하고있는 무엇

library(dplyr) 
df1 %>% 
    group_by(year) %>% 
    mutate(grp = paste("group", cumsum(c(TRUE, diff(measure) < 0)))) 
+0

dplyr에서 사용할 수 있습니까? 'cumsum (c (TRUE,' – Hatshepsut

+1

@Hatshepsut diff는 길이가 원래 길이보다 1만큼 작기 때문에 diff 출력을 논리적으로 변환 한 후 TRUE로 연결하고 cumsum을 할 때 TRUE/FALSE가 바이너리로 변환되고 모든 TRUE 값에 대해 하나가 추가됩니다. – akrun