2 Stimmen

Igraph graph.data.frame wandelt stillschweigend Faktoren in Zeichenvektoren um

Heute habe ich gelernt, dass igraph still Faktoren auf graph.data.frame verliert, daher werden Faktoren im Vertex-Datenrahmen in Zeichenvektoren umgewandelt. Gibt es einen Weg, den Faktortyp beizubehalten, z. B. für V(g)$factor_var und df <- get.data.frame(g, what="vertices"); df$factor_var? Im folgenden Code ist gender der factor_var:

actors <- data.frame(name=c("Alice", "Bob", "Cecil", "David", "Esmeralda"),
                     age=c(48,33,45,34,21),
                     gender=factor(c("F","M","F","M","F")))
relations <- data.frame(from=c("Bob", "Cecil", "Cecil", "David",
                               "David", "Esmeralda"),
                        to=c("Alice", "Bob", "Alice", "Alice", "Bob", "Alice"),
                        same.dept=c(FALSE,FALSE,TRUE,FALSE,FALSE,TRUE),
                        friendship=c(4,5,5,2,1,1), advice=c(4,5,5,4,2,3))
g <- graph.data.frame(relations, directed=TRUE, vertices=actors)
g_actors <- get.data.frame(g, what="vertices")

# Vergleiche den Typ von gender (vorher und nachher)
is.factor(actors$gender)
is.factor(g_actors$gender)

In diesem reproduzierbaren Beispiel ist actors$gender ein Faktor, aber g_actors$gender nicht. Meiner Meinung nach sollte es so sein. Ich fand keinen Kommentar zu diesem Problem in der Dokumentation.

Dies ist wichtig, weil beim Exportieren von Vertices über get.data.frame für lineare Regression Faktoren verloren gehen (lineare Regression wandelt Faktoren in Dummy-Variablen um, ignoriert jedoch Zeichenvektoren). Mir fiel auf, dass meine Faktorvariablen im Output verschwanden.

Natürlich kann ich die Faktoren nach dem Exportieren von igraph neu erstellen, aber das ist mühsam, da ich viele Graphen habe und die Ordnung der Ebenen völlig falsch ist (und ich glaube nicht, dass es notwendig sein sollte, es sei denn, igraph kann dieses Verhalten nicht über seine C++- und Python-Versionen unterstützen).

Ryan

3voto

Gabor Csardi Punkte 10560

Ja, graph.data.frame hat

newval <- d[, i]
if (class(newval) == "factor") {
  newval <- as.character(newval)
}
attrs[[names(d)[i]]] <- newval

also konvertiert es Faktoren in Zeichenketten. Ich bin mir nicht sicher, warum, aber es ist schon immer da gewesen: https://github.com/igraph/igraph/blame/c5849a89739c0dd058ff0a770aff2443745636fa/interfaces/R/igraph/R/structure.generators.R#L602

Als Workaround können Sie eine Kopie der Funktion unter einem anderen Namen erstellen und diese drei Zeilen entfernen.

Wenn Sie denken, dass dies ein Fehler ist, öffnen Sie bitte auch ein Problem unter https://github.com/igraph/igraph/issues und ich werde eine Option hinzufügen, die nicht konvertiert. Ich denke, die Standardeinstellung wird weiterhin die Konvertierung sein, einfach weil sie schon lange existiert und sich Menschen darauf verlassen könnten.

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