Den Schuldigen finden - wenn sich Zahlen nicht einlesen lassen.
Verfasst: Di Mär 29, 2022 8:52 pm
Hallo!
Manchmal will man einfach ein paar Zahlen in R einlesen und wenn dann eine einzige Zahl in der Reihe falsch geschrieben ist, hält R die ganze Zahlenreihe für Buchstaben anstelle von Zahlen. Wenn Du auf diesen Thread verwiesen worden bist, dann vermutet der Ratschlagende wahrscheinlich genau das. Je nach Länge der Zahlenkolonne kann es aufwändig sein, nach dem schuldigen Eintrag zu suchen. Dabei kann Dir die folgende Funktion helfen. Du kannst Sie mit "Alles markieren" markieren und dann einfach mit Strg-C Strg-V in Deine R Sitzung copypasten.
Danach steht Dir dann die Funktion find_culprit zur Verfügung, mit der sich der "schuldige" Eintrag in einem Vektor finden lässt, der eine Umwandlung des ganzen Vektors in eine Zahlenfolge verhindert:
Der vierte Eintrag im Vektor benutzt ein Komma anstelle des Dezimalpunkts, der sechste enthält den Buchstaben "o" anstelle der Null. Mit diesem Wissen kann man sich an die Korrektur machen.
So, und nun viel Erfolg beim Einlesen Deiner Daten.
LG,
Bernhard
Manchmal will man einfach ein paar Zahlen in R einlesen und wenn dann eine einzige Zahl in der Reihe falsch geschrieben ist, hält R die ganze Zahlenreihe für Buchstaben anstelle von Zahlen. Wenn Du auf diesen Thread verwiesen worden bist, dann vermutet der Ratschlagende wahrscheinlich genau das. Je nach Länge der Zahlenkolonne kann es aufwändig sein, nach dem schuldigen Eintrag zu suchen. Dabei kann Dir die folgende Funktion helfen. Du kannst Sie mit "Alles markieren" markieren und dann einfach mit Strg-C Strg-V in Deine R Sitzung copypasten.
Code: Alles auswählen
find_culprit <- function(vec, max = 12, silent = FALSE){
if(max < 1) # call with max = FALSE for no max
max <- Inf
if(!is.null(dim(vec))){
warning("This is not a vector.")
}
if(is.numeric(vec)){
warning("This vector is of a numeric type.")
return()
}
if(!is.factor(vec) & !is.character(vec)) {
warning("find_culprit expects either a vector of type factor or character.")
return()
}
suppressWarnings(numeric <- as.numeric(as.character(vec)))
position <- which(is.na(numeric) & !is.na(vec))
if(length(position) == 0){
cat("No culprits found.\n")
return()
}
if(!silent) {
cat("Found "); cat(length(position));
cat(" entries that could not be coerced to numeric.\nReporting ");
cat(min(length(position), max)); cat(".\n")
}
return(data.frame(position = head(position, max),
culprits = head(vec[position], max)))
}
find_culprit_tests <- function(){
library(testthat)
# warnings for wrong input
expect_warning(find_culprit(1:10))
expect_warning(find_culprit(matrix(1:4, nrow=2)))
expect_warning(find_culprit(iris))
# wrong results
expect_equal(find_culprit(c(1, 2, 3, "a", NA, 6, "b", NaN, "c"), silent = TRUE),
structure(list(position = c(4L, 7L, 8L, 9L),
culprits = c("a", "b", "NaN", "c")),
class = "data.frame", row.names = c(NA, -4L)))
expect_silent(find_culprit(iris[,5], silent = TRUE))
# test silent option
expect_output(find_culprit(c(1, 2, 3, "a", NA, 6, "b", NaN, "c"), silent = FALSE))
expect_silent(find_culprit(c(1, 2, 3, "a", NA, 6, "b", NaN, "c"), silent = TRUE))
}
Code: Alles auswählen
> test <- c("3.23", "5.90", "4.02", "4,02", "5.32", "4.OO")
> find_culprit(test)
Found 2 entries that could not be coerced to numeric.
Reporting 2.
position culprits
1 4 4,02
2 6 4.OO
So, und nun viel Erfolg beim Einlesen Deiner Daten.
LG,
Bernhard