Не очень ясно, чего вы хотите достичь, потому что вы не упоминаете пакет, который хотите использовать, но, глядя на ваши данные, кажется, что это может помочь, если вы могли бы использовать alluvial
пакет:
library(alluvial) # sankey plots
library(dplyr) # data manipulation
Функции alluvial
могут использовать данные в широком формате, как у вас, но для этого нужен столбец частоты, поэтому мы можем его создать, а затем построить график:
dats_all <- df %>% # data
group_by( firstY, secondY, ThirdY, FourthY, FifthY) %>% # group them
summarise(Freq = n()) # add frequencies
# now plot it
alluvial( dats_all[,1:5], freq=dats_all$Freq, border=NA )
В других руках, если вы хотите использовать конкретный пакет, вы должны указать, какой.
РЕДАКТИРОВАТЬ
Использование network3D немного сложнее, но вы можете достичь некоторого хорошего результата из этого.Вам нужны ссылки и узлы, и они должны быть сопоставлены, поэтому сначала мы можем создать ссылки:
# put your df in two columns, and preserve the ordering in many levels (columns) with paste0
links <- data.frame(source = c(paste0(df$firstY,'_1'),paste0(df$secondY,'_2'),paste0(df$ThirdY,'_3'),paste0(df$FourthY,'_4')),
target = c(paste0(df$secondY,'_2'),paste0(df$ThirdY,'_3'),paste0(df$FourthY,'_4'),paste0(df$FifthY,'_5')))
# now convert as character
links$source <- as.character(links$source)
links$target<- as.character(links$target)
Теперь узлы - это каждый элемент в ссылке unique()
способом:
nodes <- data.frame(name = unique(c(links$source, links$target)))
Теперь нам нужно, чтобы у каждого узла была ссылка (или наоборот), поэтому мы сопоставляем их и преобразуем в числа.Обратите внимание на -1 в конце, поскольку networkD3 равен 0 индексам, это означает, что числа (индексы) начинаются с 0.
links$source <- match(links$source, nodes$name) - 1
links$target <- match(links$target, nodes$name) - 1
links$value <- 1 # add also a value
Теперь вы должны быть готовы построить свой санкей:
sankeyNetwork(Links = links, Nodes = nodes, Source = 'source',
Target = 'target', Value = 'value', NodeID = 'name')