2015-03-26 12 views
20

Sto lavorando su un frame di dati che non ha rilevamenti codificati con "<". A volte c'è uno spazio dopo "<" ea volte non ad es. '< 2' o '< 2'. Mi piacerebbe rimuovere ogni occorrenza dello spazio.Sostituisci tutte le occorrenze di una stringa in un frame di dati

Esempio:

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 

Questo è dove ho avuto modo di:

posso estrarre tutti i valori e rendere le nuove stringhe, ma non riesco a rimetterli nella cornice di dati.

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 

risposta

18

Se siete solo cercando di sostituire tutte le occorrenze di "< " (con spazio) con "<" (senza spazio), allora si può fare un lapply sopra la struttura dei dati, con un gsub per la sostituzione:

> 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 
+2

Usa 'lapply' invece - salverà la coercizione su una matrice. – thelatemail

+11

'data.frame (lapply (dati, funzione (x) {gsub (" <\\ s * "," <", x)}))' –

+0

Ciò trasformerà l'oggetto in un elenco, quindi è necessario 'dati <- as.data.frame (data) 'dopo quello. O ovviamente la soluzione nel commento sopra, da Avinash Raj. Ultima cosa: è il 2017, quindi scriviamo 'dati <- data %>% as.data.frame()' –

9

Per rimuovere tutti gli spazi in ogni colonna, è possibile utilizzare

data[] <- lapply(data, gsub, pattern = " ", replacement = "", fixed = TRUE) 

o per restringere solo la seconda e la terza colonna (ad es. ogni colonna tranne il primo),

data[-1] <- lapply(data[-1], gsub, pattern = " ", replacement = "", fixed = TRUE) 
9

Ecco una soluzione 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 
0

ho avuto il problema, ho dovuto sostituire "Non disponibile" con NA e la mia soluzione è questa

data <- sapply(data,function(x) {x <- gsub("Not Available",NA,x)}) 
Problemi correlati