4
votes

Remplacer un caractère spécifique dans toutes les variables du bloc de données

J'ai ces données, où chaque cellule se compose de caractères ,

> testdata
       x1  x2    x3
1 1000000 000 11000
2     000 000   000
3   12000 000   000

Je veux remplacer les entrées de chaîne 0 uniquement par 000. Cela signifie que mon les données doivent ressembler à,

testdata %>% mutate_all(funs(str_replace_all(., "0", "000")))

Suivant ceci , je peux écrire ceci,

testdata2 <- data.frame(lapply(testdata, function(x) {gsub("0", "000", x)}))

Ou ceci,

> str(testdata)
    List of 3
     $ x1: chr [1:3] "100" "000" "120"
     $ x2: chr [1:3] "000" "000" "000"
     $ x3: chr [1:3] "110" "000" "000"

Dans les deux cas, il remplace ALL 0 par 000. Et les données résultantes ressemblent à ceci,

x1 <- c(100, 0, 120)
x2 <- c(0, 0, 0)
x3 <- c(110, 0, 0)
data<- data.frame(x1, x2, x3)
testdata <- lapply(data, as.character)
testdata
$`x1`
[1] "100" "0"   "120"
$x2
[1] "0" "0" "0"
$x3
[1] "110" "0"   "0" 

ce qui n'est pas ce que je suis à la recherche de. Une idée comment résoudre ce problème?


0 commentaires

5 Réponses :


1
votes

Nous pouvons utiliser ifelse avec strrep dans base R

lapply(testdata, function(x) ifelse(x == 0, strrep(x, 3), x))
#$x1
#[1] "100" "000" "120"

#$x2
#[1] "000" "000" "000"

#$x3
#[1] "110" "000" "000"

Dans les OP post, il remplace les «0» par gsub ou str_replace_all qui correspond à tous les chiffres «0» au lieu de simplement vérifier si la valeur est 0 ou non


0 commentaires

2
votes

Ou :

library(tidyverse)

testdata %>%
  map_df(~if_else(.x == "0", "000", .x))

# A tibble: 3 x 3
#x1    x2    x3   
#<chr> <chr> <chr>
#  1 100   000   110  
#2 000   000   000  
#3 120   000   000  


0 commentaires

1
votes

Dans la base R, il y a sub avec l'expression régulière appropriée.

lapply(testdata, function(x) sub("^0$", "000", x))
#$x1
#[1] "100" "000" "120"
#
#$x2
#[1] "000" "000" "000"
#
#$x3
#[1] "110" "000" "000"

Explication: "^" marque le début et "$" marque la fin de la chaîne. Ainsi, le motif "^ 0 $" est composé du caractère "0" et uniquement de ce caractère.


0 commentaires

2
votes
testdata <- as.data.frame(testdata, stringsAsFactors = F)

testdata[testdata == '0'] <- '000'

   x1  x2  x3
1 100 000 110
2 000 000 000
3 120 000 000

1 commentaires

Cela fonctionne parfaitement. J'aurais dû présenter le problème dans un data.frame. Merci.



3
votes

Vous pouvez également utiliser sprintf , c'est-à-dire

lapply(testdata, function(i)sprintf('%03d', as.numeric(i)))
#$`x1`
#[1] "100" "000" "120"

#$x2
#[1] "000" "000" "000"

#$x3
#[1] "110" "000" "000"


0 commentaires