Special grouping number for each pairs

前端 未结 1 1888
孤街浪徒
孤街浪徒 2021-01-26 10:53

There is already some part of the question answered here special-group-number-for-each-combination-of-data. In most cases we have pairs and other data values inside the data. Wh

1条回答
  •  [愿得一人]
    2021-01-26 11:33

    Here are two approaches which reproduce OP's expected result for the given sample dataset.`

    Both work in the same way. First, all "disturbing" rows, i.e., rows which do not contain "valid" names, are skipped and the rows with "valid" names are simply numbered in groups of 2. Second, the rows with exempt names are given the special group number. Finally, the NA rows are filled by carrying the last observation forward.

    data.table

    library(data.table)
    names <- c(c("bad","good"),1,2,c("good","bad"),111,c("bad","J.James"),c("good","J.James"),333,c("J.James","good"),761,'Veni',"vidi","Vici")
    exempt <- c("Veni", "vidi", "Vici")
    data.table(names)[is.na(as.numeric(names)) & !names %in% exempt, 
                      grp := rep(1:.N, each = 2L, length.out = .N)][
                        names %in% exempt, grp := 666L][
                          , grp := zoo::na.locf(grp)][]
    
          names grp
     1:     bad   1
     2:    good   1
     3:       1   1
     4:       2   1
     5:    good   2
     6:     bad   2
     7:     111   2
     8:     bad   3
     9: J.James   3
    10:    good   4
    11: J.James   4
    12:     333   4
    13: J.James   5
    14:    good   5
    15:     761   5
    16:    Veni 666
    17:    vidi 666
    18:    Vici 666
    

    dplyr/tidyr

    Here is my attempt to provide a dplyr/tidyr solution:

    library(dplyr)
    as_tibble(names) %>% 
      mutate(grp = if_else(is.na(as.numeric(names)) & !names %in% exempt,  
                           rep(1:n(), each = 2L, length.out = n()),
                           if_else(names %in% exempt, 666L, NA_integer_))) %>% 
      tidyr::fill(grp)
    
    # A tibble: 18 x 2
       value     grp
          
     1 bad         1
     2 good        1
     3 1           1
     4 2           1
     5 good        3
     6 bad         3
     7 111         3
     8 bad         4
     9 J.James     5
    10 good        5
    11 J.James     6
    12 333         6
    13 J.James     7
    14 good        7
    15 761         7
    16 Veni      666
    17 vidi      666
    18 Vici      666
    

    0 讨论(0)
提交回复
热议问题