Je travaille sur une trame de données non détectée codée avec '<'. Parfois, il y a un espace après le '<' et parfois pas, par exemple. '<2' ou '<2'. Je voudrais supprimer chaque occurrence de l'espace.
Exemple:
data <- data.frame(name = rep(letters[1:3], each = 3), var1 = rep('< 2', 9), var2 = rep('<3', 9))
name var1 var2
1 a < 2 <3
2 b < 2 <3
3 c < 2 <3
C'est ici que je dois:
Je peux extraire toutes les valeurs et créer les nouvelles chaînes mais je ne peux pas les remettre dans le cadre de données.
index <- str_detect(unlist(data), '<')
index <- matrix(index, nrow = 3)
data[index]
#[1] "< 2" "< 2" "< 2" "<3" "<3" "<3"
replacements <- str_replace_all(data[index], "<[ ]+","<")
replacements
#[1] "<2" "<2" "<2" "<3" "<3" "<3"
data[index] <- replacements
#Error in `[<-.data.frame`(`*tmp*`, index, value = c("<2", "<2", "<2", :
# unsupported matrix index in replacement
Si vous seulement cherchez à remplacer toutes les occurrences de "< "
(avec espace) avec "<"
(pas d’espace), vous pouvez alors faire un lapply
sur le cadre de données, avec un gsub
pour le remplacement:
> data <- data.frame(lapply(data, function(x) {
+ gsub("< ", "<", x)
+ }))
> data
name var1 var2
1 a <2 <3
2 a <2 <3
3 a <2 <3
4 b <2 <3
5 b <2 <3
6 b <2 <3
7 c <2 <3
8 c <2 <3
9 c <2 <3
Équivalent à "trouver et remplacer". Ne pense pas trop.
Essayez-le avec un:
library(tidyverse)
df <- data.frame(name = rep(letters[1:3], each = 3), var1 = rep('< 2', 9), var2 = rep('<3', 9))
df %>%
mutate(var1 = str_replace(var1, " ", ""))
#> name var1 var2
#> 1 a <2 <3
#> 2 a <2 <3
#> 3 a <2 <3
#> 4 b <2 <3
#> 5 b <2 <3
#> 6 b <2 <3
#> 7 c <2 <3
#> 8 c <2 <3
#> 9 c <2 <3
S'applique à tous
df %>%
mutate_all(funs(str_replace(., " ", "")))
#> name var1 var2
#> 1 a <2 <3
#> 2 a <2 <3
#> 3 a <2 <3
#> 4 b <2 <3
#> 5 b <2 <3
#> 6 b <2 <3
#> 7 c <2 <3
#> 8 c <2 <3
#> 9 c <2 <3
Si l'espace supplémentaire a été créé en unissant des colonnes, pensez à faire str_trim
une partie de votre flux de travail.
Créé le 2018-03-11 par le paquetage reprex (v0.2.0).
Pour supprimer tous les espaces de chaque colonne, vous pouvez utiliser
data[] <- lapply(data, gsub, pattern = " ", replacement = "", fixed = TRUE)
ou pour restreindre cela aux deuxième et troisième colonnes (c’est-à-dire toutes les colonnes sauf la première),
data[-1] <- lapply(data[-1], gsub, pattern = " ", replacement = "", fixed = TRUE)
Voici une solution Dplyr
library(dplyr)
library(stringr)
Censor_consistently <- function(x){
str_replace(x, '^\\s*([<>])\\s*(\\d+)', '\\1\\2')
}
test_df <- tibble(x = c('0.001', '<0.002', ' < 0.003', ' > 100'), y = 4:1)
mutate_all(test_df, funs(Censor_consistently))
# A tibble: 4 × 2
x y
<chr> <chr>
1 0.001 4
2 <0.002 3
3 <0.003 2
4 >100 1
J'ai eu le problème, j'ai dû remplacer "Not Available" par NA
et ma solution est la suivante:
data <- sapply(data,function(x) {x <- gsub("Not Available",NA,x)})
en retard à la fête. mais si vous voulez seulement vous débarrasser des espaces blancs de début/fin, R base a une fonction trimws
Par exemple:
data <- apply(X = data, MARGIN = 2, FUN = trimws) %>% as.data.frame()