Cómo numerar las observaciones basadas en el valor de una columna

A continuación es el ejemplo simplificado de mis datos, la columna new es la que yo quiero agregar a la del conjunto de datos. Básicamente, quiero cambiar el nombre de la riskset el uso de 1,2,3,4... así que va a ser más fácil para mí hacer bucles. Los números en riskset han sido ordenados, que no son continuos y hay números duplicados en la riskset (10~11 para cada número único), así cómo agregar otra columna de agrupación de las observaciones basadas en sus riskset número?

  riskset            new
a.0000000017          1
a.0000000017          1
a.0000000017          1
a.0000000017          1
a.0000000066          2
a.0000000066          2
a.0000000066          2
a.0000000066          2
a.0000000099          3
a.0000000099          3
a.0000000099          3
a.0000000099          3
a.0000000099          3
              ......

1 Respuestas

  • Maurits Evers
    4 de mayo de 2019

    Una simple base de R solución sería el uso de factors y, a continuación, cast as.integer

    as.integer(as.factor(df$riskset))
    #[1] 1 1 1 1 2 2 2 2 3 3 3 3 3
    

    O ya has pedido un dplyr opción

    df %>% mutate(new = as.integer(as.factor(riskset)))
    

    o de la base R equivalente usando transform

    transform(df, new = as.integer(as.factor(riskset)))
    

    Otra opción es el uso de dplyr::lag y cumsum

    df %>% mutate(new = cumsum(riskset != lag(riskset, default = T)) + 1)
    

    O ya que usted menciona group_by usted podría hacer

    df %>% group_by(riskset) %>% group_indices()
    

    para generar el grupo de índices.

    group_indices también funciona dentro de mutate

    df %>% group_by(riskset) %>% mutate(new = group_indices())
    

    Los datos de muestra

    df <- read.table(text =
        "  riskset            new
    a.0000000017          1
    a.0000000017          1
    a.0000000017          1
    a.0000000017          1
    a.0000000066          2
    a.0000000066          2
    a.0000000066          2
    a.0000000066          2
    a.0000000099          3
    a.0000000099          3
    a.0000000099          3
    a.0000000099          3
    a.0000000099          3", header = T)