【问题标题】:'edges' must be numeric or character. What is the problem? [duplicate]'edges' 必须是数字或字符。问题是什么? [复制]
【发布时间】:2019-06-30 23:34:58
【问题描述】:

我是编码新手,我正在尝试在 R 中执行网络分析。我有一个包含 2 列的数据框,一个是原产国,另一个是目的地。我正在尝试计算 R 中的介数和接近中心性。但是在尝试使用以下图表时:

g <- graph (c2, directed=TRUE)

,其中c2 是我的 DF 的名称,如上所述,我收到消息:

Error in graph(c2, directed = TRUE) : 
  'edges' must be numeric or character. 

我已经尝试通过以下方式将因子转换为字符:

c2 <- data.frame(lapply(c2, as.character), stringsAsFactors=F)

但由于某种原因,它没有帮助。我做错了什么?

edit* - dput(head(c2)) 给出:

> dput(head(c2))
structure(list(CountryID.Origin = c("india", "malaysia", "fiji", 
"fiji", "china", "united states (the)"), State = c("ACT", "ACT", 
"ACT", "ACT", "NSW", "NSW")), row.names = c(NA, 6L), class = "data.frame")

【问题讨论】:

  • (1) 请以明确的格式向我们展示数据,例如dput(head(c2));复制框架的柱状表示通常是不够的,尤其是在这种情况下,它的模式/类型/类受到质疑。 (2) 请检查您在问题中输入的任何/所有代码:您的第一个代码块中有一个太多的括号,例如,您错过粘贴到问题中的命令是否还有更多?
  • 感谢您的回复。如果复制柱状表示是不够的,在这种情况下我应该怎么做?我如何编码,以便 R 识别一列是源,另一列是目标国家,以便我可以绘制有向网络?括号已被编辑。
  • “复制 columnar-representation 是不够的” 为我们提供帮助,而不是为您的代码提供帮助。请使用dput(head(c2))的结果编辑您的问题

标签: r igraph network-analysis


【解决方案1】:

正如@r2evans 和@PavoDive 所指出的,在提出问题的同时提供一些数据非常重要。尽管如此,您可以尝试以下方法。我对您的数据可能是什么样子做了一些假设:

library(igraph)

df <- data.frame(Origin = c('India', 'China', 'UK', 'Russia', 'USA', 'Brazil', 'Germany', 'India', 'UK', 'China'),
                 Destination = c('China', 'UK', 'India', 'UK', 'India', 'UK', 'Russia', 'China', 'India', 'India'))

#Convert to a matrix
df.mat <- as.matrix(df)

#Convert to an igraph object
g <- graph.edgelist(df.mat, directed = TRUE)

# Make a very basic plot of the network
plot(g)

betweenness(g)

【讨论】:

  • 谢谢,这似乎解决了我的问题!
  • @Abilash 很高兴听到!如果它解决了您的问题,您可以通过打勾将其标记为答案。谢谢
  • 更简单:g &lt;- graph_from_data_frame(df).
【解决方案2】:

您不能将数据框传递给图形。它需要一个像这样的向量

("china","india","USA","india","italy","china") 

边缘在哪里 是第一对元素,第二对元素等等。所以在这个例子中,你有一个边缘中国——印度,一个边缘美国——印度,一个边缘意大利——中国。

【讨论】:

    【解决方案3】:

    你正在从igraph寻找函数graph_from_data_frame

    library(igraph)
    library(countrycode)
    library(tidyverse)
    
    df_country = countrycode::codelist %>% as_tibble()
    
    # data frame with edge list
    df_network = tibble(
      origin = sample(df_country$country.name.en, size = 1000, replace = TRUE),
      destination = sample(df_country$country.name.en, size = 1000, replace = TRUE)
    )
    
    g_network = graph_from_data_frame(df_network, directed = TRUE)
    betweenness(g_network)
    plot(g_network)
    

    【讨论】:

      猜你喜欢
      • 2020-05-26
      • 2019-11-16
      • 1970-01-01
      • 2019-08-13
      • 2020-05-05
      • 2017-05-06
      • 2019-11-04
      • 2022-11-19
      • 2019-10-15
      相关资源
      最近更新 更多