根据列中的数字移动单元格位置

问题描述 投票:0回答:1

我有以下数据

    hour   day month buy_call_cross_zero sell_call_position
   <dbl> <int> <dbl>               <dbl> <chr>             
 1     9     5     4                   0 NA                
 2    10     5     4                   0 NA                
 3    11     5     4                   0 NA                
 4    12     5     4                   0 NA                
 5    13     5     4                   0 NA                
 6    14     5     4                   0 NA                
 7    15     5     4                   0 NA                
 8    16     5     4                   0 NA                
 9     9     8     4                   2 sell              
10    10     8     4                   0 NA 

buy_call_cross_zero
列中,我有一个数字,在
sell_call_position
列中,我有一些单词“出售” - 在上面的示例中,它们对应于
2
sell
。然而,在其他观察中,我有以下几点:

> so[113:120, 1:5]
# A tibble: 8 × 5
# Groups:   day, month [1]
   hour   day month buy_call_cross_zero sell_call_position
  <dbl> <int> <dbl>               <dbl> <chr>             
1     9    25     4                   3 sell              
2    10    25     4                   0 NA                
3    11    25     4                   0 NA                
4    12    25     4                   0 NA                
5    13    25     4                   0 NA                
6    14    25     4                   0 NA                
7    15    25     4                   0 NA                
8    16    25     4                   0 NA  

还有:

> so[153:160, 1:5]
# A tibble: 8 × 5
# Groups:   day, month [1]
   hour   day month buy_call_cross_zero sell_call_position
  <dbl> <int> <dbl>               <dbl> <chr>             
1     9     2     5                   5 sell              
2    10     2     5                   0 NA                
3    11     2     5                   0 NA                
4    12     2     5                   0 NA                
5    13     2     5                   0 NA                
6    14     2     5                   0 NA                
7    15     2     5                   0 NA                
8    16     2     5                   0 NA

我想要做的是根据

sell_call_position
列中的数字向下移动
sell
观察值
buy_call_cross_zero
。因此,在第一个示例中,预期输出为:

> so[113:120, 1:5]
# A tibble: 8 × 5
# Groups:   day, month [1]
   hour   day month buy_call_cross_zero sell_call_position
  <dbl> <int> <dbl>               <dbl> <chr>             
1     9    25     4                   3 REMOVED              
2    10    25     4                   0 NA                
3    11    25     4                   0 sell                
4    12    25     4                   0 NA                
5    13    25     4                   0 NA                
6    14    25     4                   0 NA                
7    15    25     4                   0 NA                
8    16    25     4                   0 NA  

在第二个例子中,它将是:

> so[153:160, 1:5]
# A tibble: 8 × 5
# Groups:   day, month [1]
   hour   day month buy_call_cross_zero sell_call_position
  <dbl> <int> <dbl>               <dbl> <chr>             
1     9     2     5                   5 REMOVED              
2    10     2     5                   0 NA                
3    11     2     5                   0 NA                
4    12     2     5                   0 NA                
5    13     2     5                   0 sell                
6    14     2     5                   0 NA                
7    15     2     5                   0 NA                
8    16     2     5                   0 NA

数据:

df = structure(list(hour = c(9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 
11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 
11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 
11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 
11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 
11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 
11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 
11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 
11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 
11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16, 9, 10, 
11, 12, 13, 14, 15, 16, 9, 10, 11, 12, 13, 14, 15, 16), day = c(5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 9L, 
9L, 9L, 9L, 9L, 9L, 9L, 9L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 
10L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 12L, 12L, 12L, 12L, 
12L, 12L, 12L, 12L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 15L, 16L, 
16L, 16L, 16L, 16L, 16L, 16L, 16L, 17L, 17L, 17L, 17L, 17L, 17L, 
17L, 17L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 18L, 19L, 19L, 19L, 
19L, 19L, 19L, 19L, 19L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 22L, 
23L, 23L, 23L, 23L, 23L, 23L, 23L, 23L, 24L, 24L, 24L, 24L, 24L, 
24L, 24L, 24L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 25L, 26L, 26L, 
26L, 26L, 26L, 26L, 26L, 26L, 29L, 29L, 29L, 29L, 29L, 29L, 29L, 
29L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 30L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L), month = c(4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
5, 5, 5, 5, 5, 5, 5, 5, 5), buy_call_cross_zero = c(0, 0, 0, 
0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), sell_call_position = c("NA", 
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "sell", "NA", "NA", 
"NA", "NA", "NA", "NA", "NA", NA, "NA", "NA", "NA", "NA", "NA", 
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 
"NA", "sell", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 
"NA", "NA", "NA", "sell", "NA", "NA", "NA", "NA", "NA", "NA", 
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 
"sell", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA", 
"NA", "NA", "NA", "NA", "NA", "NA")), class = c("grouped_df", 
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -168L), groups = structure(list(
    day = c(1L, 2L, 3L, 5L, 8L, 9L, 10L, 11L, 12L, 15L, 16L, 
    17L, 18L, 19L, 22L, 23L, 24L, 25L, 26L, 29L, 30L), month = c(5, 
    5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 
    4), .rows = structure(list(145:152, 153:160, 161:168, 1:8, 
        9:16, 17:24, 25:32, 33:40, 41:48, 49:56, 57:64, 65:72, 
        73:80, 81:88, 89:96, 97:104, 105:112, 113:120, 121:128, 
        129:136, 137:144), ptype = integer(0), class = c("vctrs_list_of", 
    "vctrs_vctr", "list"))), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -21L), .drop = TRUE))
r tidyverse
1个回答
0
投票

这就是你所追求的吗?

within(df, {
  idx = which(sell_call_position != "NA") 
  sell_call_position[idx + buy_call_cross_zero[idx]] = sell_call_position[idx]
  sell_call_position[idx] = "REPLACED"
  rm(idx)
})

给予

    hour day month buy_call_cross_zero sell_call_position
1      9   5     4                   0                 NA
2     10   5     4                   0                 NA
3     11   5     4                   0                 NA
4     12   5     4                   0                 NA
5     13   5     4                   0                 NA
6     14   5     4                   0                 NA
7     15   5     4                   0                 NA
8     16   5     4                   0                 NA
9      9   8     4                   2           REPLACED
10    10   8     4                   0                 NA
11    11   8     4                   0               sell
12    12   8     4                   0                 NA
13    13   8     4                   0                 NA
14    14   8     4                   0                 NA
15    15   8     4                   0                 NA
16    16   8     4                   0                 NA
17     9   9     4                  NA               <NA>
...

我建议重新组织,即标准化,在上一步中

"NA"
NA
,...的外观。

© www.soinside.com 2019 - 2024. All rights reserved.