将顶点属性添加到 igraph 对象时出错:seq_len(no) 中的错误:参数必须强制转换为非负整数

问题描述

我有纵向网络数据(3 个时间点),其中并非每个时期都存在所有节点。我还为三个边列表中的每一个创建了属性列表,以确保在各自的属性数据中只有来自每个边列表的节点。由于我想通过 ID 匹配 edgelist 和 nodes 属性,我确保属性数据中的第一列是 ID,并且 edgelist 设置为 ego_id、alter_id、weight。

这是我的边缘列表示例:

edgelist_time1 <- tibble::tribble(
              ~ego_id,~alter_id,~weight,7L,8L,9L,113L,1L,114L,115L,4L,11L,6L,12L,13L,15L,4L
              )
head(edgelist_time1)
#> # A tibble: 6 x 3
#>   ego_id alter_id weight
#>    <int>    <int>  <int>
#> 1      7        8        7
#> 2      7        9        7
#> 3      7      113      1
#> 4      7      114      1
#> 5      7      115      1
#> 6      8        7         7

我从有效的边缘列表创建了一个 igraph 对象。

contact_time1_net <- graph_from_data_frame(d=edgelist_time1,directed = T)

contact_time1_net

输出

IGRAPH a75a5df DNW- 137 360 -- 
+ attr: name (v/c),weight (e/n)
+ edges from a75a5df (vertex names):
  [1] 7 ->8   7 ->9   7 ->113 7 ->114 7 ->115 8 ->7   8 ->9   8 ->11  8 ->12  8 ->13  8 ->15  9 ->7   9 ->8  
 [14] 9 ->10  9 ->11  9 ->12  9 ->13  9 ->14  9 ->15  10->11  10->12  10->113 10->116 10->117 11->7   11->9  
 [27] 11->10  11->12  11->13  11->14  11->15  12->10  12->11  12->13  12->14  12->124 13->14  13->15  13->117
 [40] 13->125 13->191 14->7   14->9   14->11  14->12  14->13  14->15  16->10  16->11  16->12  16->13  16->14 
 [53] 17->19  17->20  17->101 17->122 17->127 18->16  18->17  18->20  18->113 18->118 19->16  19->17  19->102
 [66] 19->117 19->121 19->122 19->123 20->16  20->17  20->18  20->19  20->118 21->17  21->22  21->44  21->119
 [79] 21->120 22->17  22->21  22->120 22->128 22->129 22->130 24->25  24->26  24->27  24->28  24->29  24->30 
 [92] 24->31  24->46  24->132 25->24  25->27  25->28  25->29  25->31  25->82  25->138 25->147 26->24  26->25 
+ ... omitted several edges

但是,每当我尝试分配我的顶点/节点属性时,它都会给我错误seq_len(no) 中的错误:参数必须可强制转换为非负整数。强>

contact_time1_net <- graph_from_data_frame(d=edgelist_time1,directed = T,vertices=attributes_time1)

contact_time1_net

这是我的属性数据示例:

attributes_time1 <- tibble::tribble(
                      ~ID,~plant_t1,~name_t1,~level_t1,~participation_t1,~response_time_min_t1,"Daniel",35L,"Luca",21L,"Dejan",36L,10L,"Melissa",30L,"Markus",14L,"sven","christian",23L,"Milan",21L
                      )
head(attributes_time1)
#> # A tibble: 6 x 6
#>      ID plant_t1 name_t1 level_t1 participation_t1 response_time_min_t1
#>   <int>    <int> <chr>      <int>            <int>                <int>
#> 1     7        1 Daniel         4                1                   35
#> 2     8        1 Luca           4                1                   21
#> 3     9        1 Dejan          4                1                   36
#> 4    10        1 Melissa        4                1                   30
#> 5    11        1 Markus         4                1                   14
#> 6    12        1 sven           4                1                   36

输出

IGRAPH 15f9f29 DNW- 187 360 -- + attr: name (v/c),plant_t1 (v/n),name_t1 (v/c),last_name_t1 (v/c),level_t1 (v/n),| participation_t1 (v/n),response_time_min_t1 (v/n),interest_tech_t1 (v/n),technological_skill_t1 | (v/n),training_t1 (v/n),training_app_t1 (v/n),awareness_t1 (v/n),availability_t1 (v/n),| availability_app_year_t1 (v/n),startusage_app_year_t1 (v/n),future_usage_t1 (v/n),| future_usage_frequency_t1 (v/n),current_usage_frequency_t1 (v/n),usage_machinestatus_t1 (v/n),| usage_measurementreport_t1 (v/n),usage_measuredvalues_t1 (v/n),push_machinestatus_t1 (v/n),| push_measurementreport_t1 (v/n),push_measuredvalues_t1 (v/n),ease_usage_t1 (v/n),| seed_usage_1_t1 (v/n),seed_usage_2_t1 (v/n),seed_usage_3_t1 (v/n),scaling_t1 (v/n),| sentimement_t1 (v/n),management_importance_t1 (v/n),gender_t1 (v/n),age_t1 (v/n),educ_t1 | (v/n),occup_t1 (v/n),management_2sition_t1 (v/n),language_1_t1 (v/n),language_2_t1 (v/n),| language_3_t1 (v/n),device_system_1_t1 (v/n),Covid_control_t1 (v/n),covid_changes_t1 (v/n),| covid_changes_2_t1 (v/n),weight (e/n) + edges from 15f9f29 (vertex names):

Traceback:
error in seq_len(no) : argument must be coercible to non-negative integer

17. eval(x$expr,data,x$env)

16. eval(x$expr,x$env)

15. FUN(X[[i]],...)

14. lapply(x,lazy_eval,data = data)

13. lazy_eval(args,data = c(attrs,.inc = .inc,inc = inc,adj = adj,.from = .from,from = from,.to = .to,to = to,.igraph.from = list(.Call(C_R_igraph_mybracket,graph,3L)[as.numeric(x)]),.igraph.to = list(.Call(C_R_igraph_mybracket,4L)[as.numeric(x)]),.igraph.graph = list(graph),...

12. `[.igraph.es`(edges,seq_len(no))

11. edges[seq_len(no)]

10. na.omit(es)

9. as.igraph.es(graph,na.omit(es))

8. ends(x,edges[seq_len(no)],names = names)

7. x("width",no = can_max)

6. head_print_callback(x,max_lines,header,footer,omitted_footer,...)

5. head_print(fun,max_lines = max.lines)

4. .print.edges.compressed.limit(x,edges,names,max.lines)

3. .print.edges.compressed(x,names = names,max.lines = max.lines - head_lines)

2. print.igraph(x)

1. (function (x,...) UseMethod("print"))(x)

也许,任何人都知道可能是什么问题。

非常感谢!

解决方法

您应该知道您的 attributes_time1 并未覆盖所有顶点。在这种情况下,您需要使用 merge 获得完整信息。


你可以试试这个代码

v_attr <- merge(data.frame(ID = unlist(edgelist_time1[1:2])),attributes_time1,all = TRUE)
contact_time1_net <- graph_from_data_frame(d = edgelist_time1,directed = T,vertices = unique(v_attr))

你会看到

> vertex.attributes(contact_time1_net)
$name
 [1] "7"   "8"   "9"   "10"  "11"  "12"  "13"  "14"  "15"  "113" "114" "115"

$plant_t1
 [1]  1  1  1  1  1  1  1  1 NA NA NA NA

$name_t1
 [1] "Daniel"    "Luca"      "Dejan"     "Melissa"   "Markus"    "Sven"
 [7] "christian" "Milan"     NA          NA          NA          NA

$level_t1
 [1]  4  4  4  4  4  4  4  4 NA NA NA NA

$participation_t1
 [1]  1  1  1  1  1  1  1  1 NA NA NA NA

$response_time_min_t1
 [1] 35 21 36 30 14 36 23 21 NA NA NA NA