/ / Alle Vorkommen einer Zeichenfolge in einem Datenrahmen ersetzen - r, Datenrahmen

Ersetzen Sie alle Vorkommen einer Zeichenfolge in einem Datenrahmen - r, Datenrahmen

Ich arbeite an einem Datenframe, der nicht erkannt wurdedie mit "<" codiert sind. Manchmal gibt es einen Abstand nach dem "<" und manchmal nicht z. "<2" oder "<2". Ich möchte jedes Vorkommen des Raumes entfernen.

Beispiel:

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

Hier muss ich:

Ich kann alle Werte extrahieren und die neuen Strings erstellen, aber ich kann sie nicht wieder in den Datenrahmen einfügen.

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

Antworten:

21 für die Antwort № 1

Wenn du bist nur auf der Suche nach allen Vorkommen von "< " (mit Platz) mit "<" (kein Leerzeichen), dann kannst du ein tun lapply über den Datenrahmen, mit a gsub zum Ersetzen:

> 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

10 für die Antwort № 2

Um alle Leerzeichen in jeder Spalte zu entfernen, können Sie verwenden

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

oder um dies auf die zweite und dritte Spalte zu beschränken (d. h. jede Spalte außer der ersten),

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

10 für die Antwort № 3

Hier ist eine dplyr-Lösung

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

6 für die Antwort № 4

Äquivalent zu "finden und ersetzen". Überlege es nicht.

Probieren Sie es mit einem:

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

Für alle gelten

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

Wenn der zusätzliche Raum durch das Vereinigen von Säulen erzeugt wurde, denken Sie darüber nach, etwas zu machen str_trim Teil Ihres Workflows.

Erstellt am 2018-03-11 von der Repex-Paket (v0.2.0).


1 für die Antwort № 5

Ich hatte das Problem, ich musste "Not Available" durch ersetzen NA und meine Lösung geht so

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