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