如何将我的数据框转换为可以在 R 中进行网络可视化的内容?

How do I convert my dataframe to something I can make a network visualisation of in R?

我在 R 中有一个数据框,其中每一行都是一首歌,每一列都是合作歌曲的艺术家。我想想象哪些艺术家一起工作。我想我可以做某种网络分析,但我不知道如何将我的数据框转换为网络,或者带有节点和边的东西,或者顶点。

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)

我想我需要计算(然后可视化)的是每位艺术家与其他艺术家出现在同一行的频率。然后网络会将艺术家显示为节点,将合作(加权)显示为边。

关于如何进行的任何线索?

您可以试试下面的代码

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)

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)