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?
5 Réponses :
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
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
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.
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
Cela fonctionne parfaitement. J'aurais dû présenter le problème dans un data.frame. Merci.
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"