Tengo una tabla de datos como la siguiente:

library(data.table)
DF <- as.data.table(list(ID = c(125534,"122-343",312343,"12343-343FGV", 1234, 713827), Product = c('Y', NA, NA, 'Z', NA, NA), Type = c(NA, 'D', 'G', NA, NA, NA)))

            ID Product Type 
1:       125534       Y   NA       
2:      122-343      NA    D      
3:       312343      NA    G      
4: 12343-343FGV       Z   NA     
5:         1234      NA   NA     
6:       713827      NA   NA      

Me gustaría crear una nueva columna llamada CATEGORÍA en función de cómo se categoriza el ID. Mi código incorrecto se parece a lo siguiente:

DF$CATEGORY <- ifelse(grepl("^12[0-9]|^31[0-9]|", DF$ID), 'IN', 'OUT')

Resultado deseado:

            ID Product Type CATEGORY
1:       125534       Y   NA       IN
2:      122-343      NA    D      OUT
3:       312343      NA    G       IN
4: 12343-343FGV       Z   NA      OUT
5:         1234      NA   NA      OUT
6:       713827      NA   NA      OUT

Quería codificarlo de modo que cualquier ID con letras o símbolos alfabéticos, de menos de 6 caracteres y que no comiencen con 12 o 31, esté fuera. El resto está en.

1
flightless13wings 16 dic. 2016 a las 01:06

2 respuestas

La mejor respuesta

Creo que te refieres a esto:

DF[, CATEGORY := ifelse(grepl("[^0-9]", ID) | 
                          nchar(ID) < 6 | 
                          !grepl("^12|^31", ID), 
                        "OUT", "IN")]
2
ddunn801 15 dic. 2016 a las 22:42

También podemos hacer esto creando la columna 'CATEGORÍA' con valores "SALIDA" y luego especificar la 'i' con un índice lógico que solo coincide con los criterios para los casos "EN" y asignar (:=) la 'CATEGORÍA' entrar"

DF[, CATEGORY := "OUT"][grepl("^(12|31)[0-9]{4,}$", ID), CATEGORY := "IN"]
DF
#             ID Product Type CATEGORY
#1:       125534       Y   NA       IN
#2:      122-343      NA    D      OUT
#3:       312343      NA    G       IN
#4: 12343-343FGV       Z   NA      OUT
#5:         1234      NA   NA      OUT
#6:       713827      NA   NA      OUT
1
akrun 16 dic. 2016 a las 00:36