2017-12-15 42 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を見つけるまで同じ値を維持します。ギャップが1より小さい場合、visit_noの値はvisit_noの前の行に与えられます。そしてvisit_no。常にこれは、これはかなりAntoniosKの答えと同じですが、データフレーム

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

あるユーザーのために1から開始し、ITR ..Visit_No列がuser_idをによってグループ化されており、ITR

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 
関連する問題