709 Stimmen

Umrechnung eines Faktors in eine ganze Zahl \numeric ohne Informationsverluste?

Wenn ich einen Faktor in einen numerischen oder ganzzahligen Wert umwandle, erhalte ich die zugrunde liegenden Ebenencodes und nicht die Werte als Zahlen.

f <- factor(sample(runif(5), 20, replace = TRUE))
##  [1] 0.0248644019011408 0.0248644019011408 0.179684827337041 
##  [4] 0.0284090070053935 0.363644931698218  0.363644931698218 
##  [7] 0.179684827337041  0.249704354675487  0.249704354675487 
## [10] 0.0248644019011408 0.249704354675487  0.0284090070053935
## [13] 0.179684827337041  0.0248644019011408 0.179684827337041 
## [16] 0.363644931698218  0.249704354675487  0.363644931698218 
## [19] 0.179684827337041  0.0284090070053935
## 5 Levels: 0.0248644019011408 0.0284090070053935 ... 0.363644931698218

as.numeric(f)
##  [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2

as.integer(f)
##  [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2

Ich muss zurückgreifen auf paste um die tatsächlichen Werte zu erhalten:

as.numeric(paste(f))
##  [1] 0.02486440 0.02486440 0.17968483 0.02840901 0.36364493 0.36364493
##  [7] 0.17968483 0.24970435 0.24970435 0.02486440 0.24970435 0.02840901
## [13] 0.17968483 0.02486440 0.17968483 0.36364493 0.24970435 0.36364493
## [19] 0.17968483 0.02840901

Gibt es eine bessere Möglichkeit, einen Faktor in einen numerischen Wert umzuwandeln?

7 Stimmen

Die Stufen eines Faktors werden ohnehin als Zeichendatentyp gespeichert ( attributes(f) ), daher glaube ich nicht, dass es etwas gegen die as.numeric(paste(f)) . Vielleicht wäre es besser, darüber nachzudenken, warum Sie (in dem spezifischen Kontext) überhaupt einen Faktor erhalten, und zu versuchen, dies zu verhindern. Ist z. B. der dec Argument in read.table richtig eingestellt?

0 Stimmen

Wenn Sie einen Datenrahmen verwenden, können Sie convert from hablar verwenden. df %>% convert(num(column)) . Wenn Sie einen Faktorvektor haben, können Sie auch as_reliable_num(factor_vector)

1 Stimmen

Vielen Dank für diese Frage. Dies ist SO VIEL f

5voto

Robert Bray Punkte 373

strtoi() funktioniert, wenn Ihre Faktorstufen ganze Zahlen sind.

0 Stimmen

Eine schöne, einfache Lösung, die auch so schnell ist wie andere Lösungen.

4voto

Jerry T Punkte 1336

Spät zum Spiel, zufällig fand ich trimws() kann konvertieren factor(3:5) a c("3","4","5") . Dann können Sie anrufen as.numeric() . Das heißt:

as.numeric(trimws(x_factor_var))

4 Stimmen

Gibt es einen Grund, warum Sie die Verwendung von trimws über as.character wie in der akzeptierten Antwort beschrieben? Ich habe den Eindruck, dass Sie nur dann Leerzeichen entfernen müssen, wenn Sie tatsächlich Leerzeichen haben, trimws wird nur einen Haufen unnötiger Arbeit mit regulären Ausdrücken machen, um das gleiche Ergebnis zu liefern.

1 Stimmen

As.numeric(levels(f))[f] könnte für Anfänger etwas verwirrend und schwer zu merken sein. trimws schadet nicht.

3voto

Ritchie Sacramento Punkte 22572

type.convert(f) auf einen Faktor, dessen Stufen vollständig numerisch sind, ist eine weitere Basisoption.

Die Leistung entspricht in etwa der von as.numeric(as.character(f)) aber nicht annähernd so schnell wie as.numeric(levels(f))[f] .

identical(type.convert(f), as.numeric(levels(f))[f])

[1] TRUE

Das heißt, wenn der Grund, warum der Vektor als Faktor in der ersten Instanz erstellt wurde, nicht behoben wurde (d.h. er enthielt wahrscheinlich einige Zeichen, die nicht in numerische Werte umgewandelt werden konnten), dann wird dieser Ansatz nicht funktionieren und einen Faktor zurückgeben.

levels(f)[1] <- "some character level"
identical(type.convert(f), as.numeric(levels(f))[f])

[1] FALSE

-1voto

Xavier Prudent Punkte 1423

Aus den vielen Antworten, die ich lesen konnte, ging hervor, dass die einzige Möglichkeit darin bestand, die Anzahl der Variablen entsprechend der Anzahl der Faktoren zu erweitern. Wenn Sie eine Variable "Haustier" mit den Ebenen "Hund" und "Katze" haben, würden Sie am Ende pet_dog und pet_cat haben.

In meinem Fall wollte ich die gleiche Anzahl von Variablen beibehalten, indem ich die Faktorvariable einfach in eine numerische Variable umwandelte, und zwar so, dass sie auf viele Variablen mit vielen Ebenen angewendet werden kann, so dass beispielsweise Katze=1 und Hund=0 ist.

Die entsprechende Lösung finden Sie unten:

crime <- data.frame(city = c("SF", "SF", "NYC"),
                    year = c(1990, 2000, 1990),
                    crime = 1:3)

indx <- sapply(crime, is.factor)

crime[indx] <- lapply(crime[indx], function(x){ 
  listOri <- unique(x)
  listMod <- seq_along(listOri)
  res <- factor(x, levels=listOri)
  res <- as.numeric(res)
  return(res)
}
)

-2voto

Es sieht so aus, als ob die Lösung as.numeric(levels(f))[f] nicht mehr mit R 4.0 funktioniert.

Alternative Lösung:

factor2number <- function(x){
    data.frame(levels(x), 1:length(levels(x)), row.names = 1)[x, 1]
}

factor2number(yourFactor)

0 Stimmen

?? Unter R 4.1 funktioniert es.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X