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 № 1Wenn 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)})