Suivi de data.table

df <- data.table(id=c(1,2,3,4,5),
                 variable=c("250.00","250.13","250.56","250.01","Value1"))
1:  1   250.00
2:  2   250.13
3:  3   250.56
4:  4   250.01
5:  5   Value1

Je veux remplacer tous les 250. nombres qui se terminent par un nombre impair par Value1 et les autres qui se terminent par un nombre pair par Value2. J'ai essayé d'utiliser la fonction grepl de la manière suivante.

df$variable[grepl('250\\.[0-9]1|3|5', df$variable)] <-'Value1'
df$variable[grepl('250\\.[0-9]0|2|4', df$variable)] <-'Value2'

Mais il remplace tous les 250. par Value1. Quelle est la meilleure façon d'obtenir ces résultats:

1:  1   Value2
2:  2   Value1
3:  3   Value2
4:  4   Value1
5:  5   Value1

Dans le data.table d'origine, il y a plus de valeurs. Une solution avec base qui peut gérer data.table serait formidable.

1
Svenja 28 août 2020 à 18:35

3 réponses

Meilleure réponse

La raison en est votre expression regex. Ceci est une application qui est vraiment utile pour comprendre à quoi correspondra votre expression régulière. https://spannbaueradam.shinyapps.io/r_regex_tester/

250\\.[0-9]1|3|5 recherche 250\\.[0-9]1 OU 3 OU 5 et comme tous les 250.x contiennent 5, ils correspondent tous.

250\\.[0-9][135] recherchera une valeur qui se termine par 1, 3 ou 5 ***. Les valeurs de [] sont considérées comme une liste OR.

*** ce n'est pas correct à 100%, ce modèle serait [135]$, mais cela correspondrait à 'Value1' car il se termine par un 1.

1
Mark 28 août 2020 à 15:50

Nous pourrions également utiliser

library(data.table)
df[grepl('^[0-9]', variable),  variable := 
     c("Value2", "Value1")[(as.integer(sub(".*\\.", "", variable)) %% 2)+1]]
df
#   id variable
#1:  1   Value2
#2:  2   Value1
#3:  3   Value2
#4:  4   Value1
#5:  5   Value1
0
akrun 28 août 2020 à 20:58

Une autre façon d'utiliser la bibliothèque stringr

library(dplyr)
library(stringr)
df %>% 
  mutate(variable = str_replace_all(variable, c("250.\\d?[13579]$" = "Value1", "250.\\d?[02468]$" = "Value2")))
#     id variable
# 1:  1   Value2
# 2:  2   Value1
# 3:  3   Value2
# 4:  4   Value1
# 5:  5   Value1
0
Tho Vu 28 août 2020 à 20:43