【发布时间】:2019-04-23 01:55:28
【问题描述】:
在我对这个问题的回答之后,我有一个问题 Matching vertex attributes across a list of edgelists R
我的解决方案是使用 for 循环,但我们应该始终尽可能优化(矢量化)。
我想了解的是如何将我在帖子中提出的解决方案矢量化。
我的解决方案是
for(i in 1:length(graph_list)){
graph_list[[i]]=set_vertex_attr(graph_list[[i]],"gender", value=attribute_df$gender[match(V(graph_list[[i]])$name, attribute_df$names)])
}
理想情况下,我们可以使用 lapply 将其矢量化,但我在构思如何做到这一点时遇到了一些麻烦。这就是我所拥有的
graph_lists_new=lapply(graph_list, set_vertex_attr, value=attribute_df$gender[match(V(??????????)$name, attribute_df$names)]))
我不清楚的是我在?????? 的部分中添加了什么。 V() 函数中的内容应该是列表中的每个项目,但我没有得到的是我在使用 lapply 时放入的内容。
所有数据都可以在我发布的链接中找到,但无论如何都是数据
attribute_df<- structure(list(names = structure(c(6L, 7L, 5L, 2L, 1L, 8L, 3L,
4L), .Label = c("Andy", "Angela", "Eric", "Jamie", "Jeff", "Jim",
"Pam", "Tim"), class = "factor"), gender = structure(c(3L, 2L,
3L, 2L, 3L, 1L, 1L, 2L), .Label = c("", "F", "M"), class = "factor"),
happiness = c(8, 9, 4.5, 5.7, 5, 6, 7, 8)), class = "data.frame", row.names = c(NA,
-8L))
edgelist<-list(structure(list(nominator1 = structure(c(3L, 4L, 1L, 2L), .Label = c("Angela",
"Jeff", "Jim", "Pam"), class = "factor"), nominee1 = structure(c(1L,
2L, 3L, 2L), .Label = c("Andy", "Angela", "Jeff"), class = "factor")), class = "data.frame", row.names = c(NA,
-4L)), structure(list(nominator2 = structure(c(4L, 1L, 2L, 3L
), .Label = c("Eric", "Jamie", "Oscar", "Tim"), class = "factor"),
nominee2 = structure(c(1L, 3L, 2L, 3L), .Label = c("Eric",
"Oscar", "Tim"), class = "factor")), class = "data.frame", row.names = c(NA,
-4L)))
graph_list<- lapply(edgelist, graph_from_data_frame)
【问题讨论】:
-
lapply不是矢量化——它只是“循环隐藏”。在这种情况下,您的for循环是比lapply更好的处理方式。由于您正在修改现有对象,而lapply可能需要制作完整的副本,因此您的简单for循环几乎肯定会比lapply解决方案更有效,并且更具可读性。
标签: r vectorization