2017-12-15 9 views
0

내가 열을 만들려면이행 조건에 따라 열을 생성

user_id Gap itr visit_no.(desired column) 
     a 0.3 1   1 
     a 0.5 1   1 
     a 1.5 1   1 
     a 0.9 1   2 
     a 2.6 1   2 
     a 0.34 1   3 
     a 0.8 2   1 
     a 0.34 2   1 
     b 1.6 1   1 
     b 0.7 1   2 
     b 0.8 1   2 
     b 0.7 1   2 
     b 4.8 2   1 
     b 0.39 2   2 
     b 0.38 2   2 
     b 0.89 2   2 

과 같은 데이터 세트를 (visit_no.). 간격이 1보다 커질 때마다 visit_no를 늘려야합니다. 값이 다음 행에서 1 씩 증가하고 다른 값> 1을 발견 할 때까지 동일하게 유지 될 것이므로 증가 순서대로 일련 번호를 계속 할당 할 것입니다. 간격이 1보다 작 으면 visit_no 값이 이전 visit_no 행에 주어집니다. 그리고 visit_no. 항상 사용자와 ITR ..Visit_No 열 1에서 시작하는 것 USER_ID별로 그룹화 및 ITR

df<-data.frame(user=c("a","a","a","a","a","a","a","a","b","b","b","b","b","b","b","b") 
        , gap=c(0.3,0.5,1.5,0.9,2.6,0.34,0.8,0.34,1.6,0.7,0.8,0.7,4.8,0.39,0.76,0.72), 
        itr=c(1,1,1,1,1,1,2,2,1,1,1,1,2,2,2,2)) 
+1

원하는 열을 수정할 수 있습니까? 모든 값을 포함하고 올바른지 확인하십시오 – Sotos

+0

원하는 출력이 잘 형식화되지 않은 것처럼 보입니다 ... 행 6의 간격 0.034입니까? 첫 번째 열의 모든 a와 b는 무엇입니까? 네가하고 싶은 일이 내게는 분명하지 않다. – guscht

+0

예 간격의 6 번째 행은 0.34 ..... 데이터의 형식이 올바르게 지정되었습니다. –

답변

2
library(dplyr) 

df<-data.frame(user=c("a","a","a","a","a","a","a","a","b","b","b","b","b","b","b","b") 
       , gap=c(0.3,0.5,1.5,0.9,2.6,0.34,0.8,0.34,1.6,0.7,0.8,0.7,4.8,0.39,0.76,0.72), 
       itr=c(1,1,1,1,1,1,2,2,1,1,1,1,2,2,2,2)) 

df %>% 
    group_by(user, itr) %>% 
    mutate(visit_no = cumsum(ifelse(lag(gap, default = 2) > 1, 1, 0))) %>% 
    ungroup() 

# # A tibble: 16 x 4 
#  user gap itr visit_no 
# <fctr> <dbl> <dbl> <dbl> 
# 1  a 0.30  1  1 
# 2  a 0.50  1  1 
# 3  a 1.50  1  1 
# 4  a 0.90  1  2 
# 5  a 2.60  1  2 
# 6  a 0.34  1  3 
# 7  a 0.80  2  1 
# 8  a 0.34  2  1 
# 9  b 1.60  1  1 
# 10  b 0.70  1  2 
# 11  b 0.80  1  2 
# 12  b 0.70  1  2 
# 13  b 4.80  2  1 
# 14  b 0.39  2  2 
# 15  b 0.76  2  2 
# 16  b 0.72  2  2 
1

이 거의 AntoniosK 응답과 동일한 dataframe이지만, 할 수있다 data.table에는 배관 작업자가없고 data.tableshift -function으로 표시됩니다.

library(data.table) 
dt <- data.table(df) 
dt[, visit_no := cumsum(ifelse(shift(gap, n = 1, type = "lag", fill = 0)>1,1,0)) + 1, by = c("user", "itr")] 
dt 
# user gap itr visit_no 
# 1: a 0.30 1  1 
# 2: a 0.50 1  1 
# 3: a 1.50 1  1 
# 4: a 0.90 1  2 
# 5: a 2.60 1  2 
# 6: a 0.34 1  3 
# 7: a 0.80 2  1 
# 8: a 0.34 2  1 
# 9: b 1.60 1  1 
#10: b 0.70 1  2 
#11: b 0.80 1  2 
#12: b 0.70 1  2 
#13: b 4.80 2  1 
#14: b 0.39 2  2 
#15: b 0.76 2  2 
#16: b 0.72 2  2 
관련 문제