今天,我了解到igraph静默地丢失了graph.data.frame上的因子,因此顶点数据帧中的因子被转换为字符向量。有没有办法保留因素类型,例如forV(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)
在此可重现的示例中,actors $ gender是一个因素,而g_actors $ gender不是。我认为应该如此。在文档中,我没有对此问题发表任何评论。
这一点很重要,因为通过导出get.data.frame
用于线性回归的顶点会松散因子(线性回归会将因子转换为虚拟变量,但会忽略字符向量)。我注意到了,因为我的因子变量在输出中消失了。
当然,从igraph导出后,我可以重新创建因子,但是这很繁琐,因为我有很多图并且级别排序都是错误的(并且我不认为这是必要的,除非igraph无法在其整个图上支持这种行为。 C ++和python版本)。
瑞安
是的,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上打开一个问题,我将添加一个选项,它不太转换。我认为默认值仍然是转换,因为它已经存在很长时间了,人们可能会依赖它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句