繁体   English   中英

igraph graph.data.frame默默地将因子转换为字符向量

[英]igraph graph.data.frame silently converts factors to character vectors

今天,我了解到igraph在graph.data.frame中默默丢失了因子,因此顶点数据帧中的因子被转换为字符向量。 有没有办法保留因子类型,例如对于V(g)$factor_vardf <- get.data.frame(g, what="vertices"); df$factor_var df <- get.data.frame(g, what="vertices"); df$factor_var 在以下代码中, genderfactor_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导出顶点get.data.frame进行线性回归会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上打开一个问题,我将添加一个不太转换的选项。 我认为默认值仍然会是转换,因为它已经存在很长时间了,人们可能会依赖它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM