2016-09-25 2 views
2

を変えるまで:R:複数行の上に値を渡し、別の列の値が、私は次の形式で顧客の活動データを持っている

id = rep(1:2, each = 7) 
week = rep(22:28, 2) 
orders_num = c(NA, 1,0,0,0,3,0,1,4,0,0,1,0,0) 
orders_char = c("none", "1", "none", "none", "none", "2+", "none", "1", "2+", "none", "none","1", "none", "none") 
activity =c(NA, "active", "lapsed1", "lapsed2", "lapsed3", "active", "lapsed1", "active", "active", "lapsed1", "lapsed2" , "active", "lapsed1", "lapsed2") 

df = data.frame(cbind(id, week, orders_num, orders_char, activity)) 
df 
id week orders_num orders_char activity 
1 22  <NA>  none  <NA> 
1 23   1   1 active 
1 24   0  none lapsed1 
1 25   0  none lapsed2 
1 26   0  none lapsed3 
1 27   3   2+ active 
1 28   0  none lapsed1 
2 22   1   1 active 
2 23   4   2+ active 
2 24   0  none lapsed1 
2 25   0  none lapsed2 
2 26   1   1 active 
2 27   0  none lapsed1 
2 28   0  none lapsed2 

私はそれだろう列を作成しようとしています単に以前に言及、明らかに

df_solution 
id week orders_num orders_char activity  final 
1 22  <NA>  none  <NA>  <NA> 
1 23   1   1 active active_1 
1 24   0  none lapsed1 lapsed1_1 
1 25   0  none lapsed2 lapsed2_1 
1 26   0  none lapsed3 lapsed3_1 
1 27   3   2+ active active_2+ 
1 28   0  none lapsed1 lapsed1_2+ 
2 22   1   1 active active_1 
2 23   4   2+ active active_2+ 
2 24   0  none lapsed1 lapsed1_2+ 
2 25   0  none lapsed2 lapsed2_2+ 
2 26   1   1 active active_1 
2 27   0  none lapsed1 lapsed1_1 
2 28   0  none lapsed2 lapsed2_1 

activityの組み合わせとactivity == "active"場合orders_char、最新'active'状況に応じorders_charとそれぞれ'lapsed'カテゴリを返します行はlapsed期間が長く続く場合には仕事に行くされていません。

df %>% group_by(id) %>% arrange(id, week) %>% 
mutate(final = ifelse(activity == "active", paste(activity, orders_char, sep="_"), 
        ifelse(grepl("lapsed", activity), paste(activity, lag(orders_char), sep="_"), NA))) 

id week orders_num orders_char activity  final 
    1  22   NA  none  NA   <NA> 
    1  23   1   1 active  active_1 
    1  24   0  none lapsed1 lapsed1_1 
    1  25   0  none lapsed2 lapsed2_none 
    1  26   0  none lapsed3 lapsed3_none 
    1  27   3   2+ active active_2+ 
    1  28   0  none lapsed1 lapsed1_2+ 
    2  22   1   1 active  active_1 
    2  23   4   2+ active active_2+ 
    2  24   0  none lapsed1 lapsed1_2+ 
    2  25   0  none lapsed2 lapsed2_none 
    2  26   1   1 active  active_1 
    2  27   0  none lapsed1 lapsed1_1 
    2  28   0  none lapsed2 lapsed2_none 

は、私が他の1つのアクティブ期間からorders_char値を「修正」する可能性のある方法はありますか?

お寄せいただきありがとうございます!

答えて

1

'id'と 'week'でグループ化した後、論理ベクトル(orders_char!= 'none')の累積合計を取得し、 'なし'なしで 'orders_char'の要素に置き換えますorders_char[orders_char != "none"])、pasteには「activity」列があります。

df %>% 
    group_by(id) %>% 
    arrange(id, week) %>% 
    mutate(ind = cumsum(orders_char != "none"), 
      ind1 = ind*(NA^!ind), 
      final = ifelse(is.na(ind1), NA, paste(activity, 
       as.character(orders_char[orders_char!="none"])[ind1], sep="_"))) %>% 
    select(-ind, -ind1) 

#  id week orders_num orders_char activity  final 
# <fctr> <fctr>  <fctr>  <fctr> <fctr>  <chr> 
#1  1  22   NA  none  NA  <NA> 
#2  1  23   1   1 active active_1 
#3  1  24   0  none lapsed1 lapsed1_1 
#4  1  25   0  none lapsed2 lapsed2_1 
#5  1  26   0  none lapsed3 lapsed3_1 
#6  1  27   3   2+ active active_2+ 
#7  1  28   0  none lapsed1 lapsed1_2+ 
#8  2  22   1   1 active active_1 
#9  2  23   4   2+ active active_2+ 
#10  2  24   0  none lapsed1 lapsed1_2+ 
#11  2  25   0  none lapsed2 lapsed2_2+ 
#12  2  26   1   1 active active_1 
#13  2  27   0  none lapsed1 lapsed1_1 
#14  2  28   0  none lapsed2 lapsed2_1 
+0

私は、私がコードが常に正しい値を返すとは限りません。 5行目の 'final'カラムは' lapsed3_1'を返すべきです、7回目は 'lapsed1_2 + 'などを返すべきです。基本的に、' lapsed'セルは 'active'ステータスの' orders_char'値を持っていなければなりません。センス。どのようにこれを達成するための任意の提案?あなたの助けをもう一度ありがとう! –

+0

@KasiaKulma今すぐご確認ください。 'factor'クラスはいくつかの問題を引き起こしたと思います。 – akrun

+1

素晴らしい、これは魅力のように動作します、ありがとう! –

関連する問題