今天我了解到igraph在graph.data.frame上默默地丢失因子,因此顶点数据框中的因子被转换为字符向量。有没有办法保留因子类型,例如对于V(g)$factor_var
和df <- get.data.frame(g, what="vertices"); df$factor_var
?在以下代码中,gender
是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")
# Compare type of gender (before and after)
is.factor(actors$gender)
is.factor(g_actors$gender)
在这个可重复的例子中,演员$性别是一个因素,但g_actors $性别不是。在我看来,它应该是。我在文档中没有发现有关此问题的评论。
这很重要,因为通过get.data.frame
导出顶点进行线性回归会失去因子(线性回归将因子转换为虚拟变量,但忽略了字符向量)。我注意到因为我的因子变量在输出中消失了。
当然,我可以在从igraph导出后重新创建因子,但这很乏味,因为我有很多图形,级别排序都是错误的(我不相信它应该是必要的,除非igraph不能支持这个跨C ++和python版本的行为。)
赖安
答案 0 :(得分:3)
是的,graph.data.frame
已
newval <- d[, i]
if (class(newval) == "factor") {
newval <- as.character(newval)
}
attrs[[names(d)[i]]] <- newval
所以它将因子转换为字符。我不确定为什么,但它一直存在: https://github.com/igraph/igraph/blame/c5849a89739c0dd058ff0a770aff2443745636fa/interfaces/R/igraph/R/structure.generators.R#L602
作为一种变通方法,您可以使用其他名称创建该函数的副本,并删除这三行。
如果您认为这是一个错误,那么请在https://github.com/igraph/igraph/issues处打开一个问题,我会添加一个不太转换的选项。我认为默认仍然是转换,因为它已经存在了很长时间,人们可能会依赖它。