我在R中有一个dataframe,其中每一行都是一首歌,每一列都是在这首歌上协作的艺术家。我想想象哪些艺术家一起工作。我想我可以做一些网络分析,但是我不知道如何把我的数据转换成一个网络,或者一些有节点和边的东西,或者一个顶点。
song <- c('You','Strings','Club','Never','Yolo','Do it','Again','The world', 'Forever')
artist1 <- c('Art', 'Bee', 'Con', 'Con', 'Dev', 'Art', 'Evi', 'Evi', 'Guy')
artist2 <- c('Bee', 'Evi', NA, 'Bee', 'Fay', 'Con', 'Bee', 'Dev', NA)
artist3 <- c('Con', 'Fay', NA, NA, NA, 'Bee', 'Art', 'Con', NA)
df <- data.frame(song, artist1, artist2, artist3)我想我需要计算(然后想象)每一个艺术家在同一排中发生的频率。然后,网络将艺术家显示为节点,协作(加权)显示为边缘。
关于该怎么走有什么线索吗?
发布于 2022-05-05 09:24:47
使用crossprod创建一个邻接矩阵,然后使用graph_from_adjacency_matrix创建一个图形对象,然后绘制它:
ta <- crossprod(table(cbind(df[1], stack(df[-1]))[-3]))
graph_from_adjacency_matrix(ta, diag = F, weighted = T, mode = "undirected") %>%
plot(edge.width = E(.)$weight)

发布于 2022-05-05 08:51:04
您可以尝试下面的代码
df %>%
pivot_longer(!song, values_drop_na = TRUE) %>%
select(!name) %>%
rev() %>%
graph_from_data_frame() %>%
set_vertex_attr(name = "type", value = names(V(.)) %in% df$song) %>%
plot(layout = layout_as_bipartite)

https://stackoverflow.com/questions/72124282
复制相似问题