bugfix> r > 投稿

4列のデータフレームがあります

g データ内のグループIDを表します

x 計算を実行する必要がある文字タイプIDを表します

date はアクションの日付であり、他の分析に使用されます。 (ただし、レコードの順序が保持されるように、同じものを保持しています)

action 実行するアクションです。この列には、「add」と「reduce」の2つの値があります。これらは各グループの数が同じです g 。 'add'を持つレコードが5つある場合、同じグループに 'reduce'が5つあることを意味します。データフレームに順序付けられた要素として記録されます。

基本的に、次のルールで新しい列を作成する必要があります-

  • 各グループの最初のレコードは常に「追加」になるため、正確な値は x ここで使用できます

  • 2番目以降のレコードでは、各グループで、 x 'action'値が 'add'の場合、前のレコードに貼り付けることができます

  • 2番目以降のレコードでは、各グループで、 x 'action'値が 'reduce'である場合、前のレコードから削除される可能性があります

dput サンプルデータの

df <- structure(list(g = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 
3L, 3L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 6L, 6L, 7L, 7L, 8L, 8L, 
8L, 8L), x = c("1_", "1_", "2_", "2_", "2_", "1_", "2_", "1_", 
"1_", "1_", "1_", "2_", "2_", "2_", "1_", "2_", "3_", "3_", "3_", 
"3_", "4_", "4_", "3_", "3_", "3_", "3_", "3_", "3_", "4_", "5_", 
"4_", "5_", "6_", "6_", "6_", "6_", "7_", "7_", "7_", "7_", "8_", 
"8_", "8_", "8_"), date = structure(c(18262, 18264, 18265, 18266, 
18271, 18275, 18275, 18276, 18277, 18279, 18280, 18283, 18286, 
18287, 18288, 18291, 18262, 18264, 18275, 18276, 18277, 18288, 
18275, 18283, 18291, 18297, 18301, 18309, 18366, 18374, 18375, 
18381, 18309, 18319, 18328, 18347, 18364, 18367, 18303, 18309, 
18328, 18341, 18341, 18344), class = "Date"), action = structure(c(1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 
1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 
1L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("add", 
"reduce"), class = c("ordered", "factor"))), row.names = c(NA, 
-44L), groups = structure(list(g = 1:8, .rows = structure(list(
    1:16, 17:22, 23:28, 29:32, 33:36, 37:38, 39:40, 41:44), ptype = integer(0), class = c("vctrs_list_of", 
"vctrs_vctr", "list"))), row.names = c(NA, -8L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"))
df
# A tibble: 44 x 4
# Groups:   g [8]
       g x     date       action
   <int> <chr> <date>     <ord> 
 1     1 1_    2020-01-01 add   
 2     1 1_    2020-01-03 add   
 3     1 2_    2020-01-04 add   
 4     1 2_    2020-01-05 add   
 5     1 2_    2020-01-10 reduce
 6     1 1_    2020-01-14 reduce
 7     1 2_    2020-01-14 reduce
 8     1 1_    2020-01-15 reduce
 9     1 1_    2020-01-16 add   
10     1 1_    2020-01-18 add   
# ... with 34 more rows

desired result のようかもしれません-

head(as_tibble(df3_r),12)
# A tibble: 12 x 6
       X     g x     date       action result  
   <int> <int> <chr> <chr>      <chr>  <chr>   
 1     1     1 1_    01-01-2020 add    1_      
 2     2     1 1_    03-01-2020 add    1_1_    
 3     3     1 2_    04-01-2020 add    1_1_2_  
 4     4     1 2_    05-01-2020 add    1_1_2_2_
 5     5     1 2_    10-01-2020 reduce 1_1_2_  
 6     6     1 1_    14-01-2020 reduce 1_2_    
 7     7     1 2_    14-01-2020 reduce 1_      
 8     8     1 1_    15-01-2020 reduce NA      
 9     9     1 1_    16-01-2020 add    1_      
10    10     1 1_    18-01-2020 add    1_1_    
11    11     1 1_    19-01-2020 reduce 1_      
12    12     1 2_    22-01-2020 add    1_2_

前もって感謝します。

回答 1 件
  • 使用できます accumulate2 から purrr パッケージ。

    library(dplyr)
    library(purrr)
    df %>% 
      mutate(result = unlist(accumulate2(
        x, action[-1L], ~if (..3 == "add") paste0(., .y) else sub(.y, "", .)
      )))
    
    

    出力

      g  x       date action   result
    1  1 1_ 2020-01-01    add       1_
    2  1 1_ 2020-01-03    add     1_1_
    3  1 2_ 2020-01-04    add   1_1_2_
    4  1 2_ 2020-01-05    add 1_1_2_2_
    5  1 2_ 2020-01-10 reduce   1_1_2_
    6  1 1_ 2020-01-14 reduce     1_2_
    7  1 2_ 2020-01-14 reduce       1_
    8  1 1_ 2020-01-15 reduce         
    9  1 1_ 2020-01-16    add       1_
    10 1 1_ 2020-01-18    add     1_1_
    11 1 1_ 2020-01-19 reduce       1_
    12 1 2_ 2020-01-22    add     1_2_
    13 1 2_ 2020-01-25 reduce       1_
    14 1 2_ 2020-01-26    add     1_2_
    15 1 1_ 2020-01-27 reduce       2_
    16 1 2_ 2020-01-30 reduce         
    17 2 3_ 2020-01-01    add       3_
    18 2 3_ 2020-01-03    add     3_3_
    19 2 3_ 2020-01-14 reduce       3_
    20 2 3_ 2020-01-15 reduce         
    21 2 4_ 2020-01-16    add       4_
    22 2 4_ 2020-01-27 reduce         
    23 3 3_ 2020-01-14    add       3_
    24 3 3_ 2020-01-22 reduce         
    25 3 3_ 2020-01-30    add       3_
    26 3 3_ 2020-02-05 reduce         
    27 3 3_ 2020-02-09    add       3_
    28 3 3_ 2020-02-17 reduce         
    29 4 4_ 2020-04-14    add       4_
    30 4 5_ 2020-04-22    add     4_5_
    31 4 4_ 2020-04-23 reduce       5_
    32 4 5_ 2020-04-29 reduce         
    33 5 6_ 2020-02-17    add       6_
    34 5 6_ 2020-02-27    add     6_6_
    35 5 6_ 2020-03-07 reduce       6_
    36 5 6_ 2020-03-26 reduce         
    37 6 7_ 2020-04-12    add       7_
    38 6 7_ 2020-04-15 reduce         
    39 7 7_ 2020-02-11    add       7_
    40 7 7_ 2020-02-17 reduce         
    41 8 8_ 2020-03-07    add       8_
    42 8 8_ 2020-03-20 reduce         
    43 8 8_ 2020-03-20    add       8_
    44 8 8_ 2020-03-23 reduce        
    
    

あなたの答え