R 如何将纵向数据转换为连接数据?

R 如何将纵向数据转换为连接数据?,r,sankey-diagram,R,Sankey Diagram,我有以下形式的数据: id state 1 s_1 1 s_2 1 s_3 2 s_1 2 s_3 3 s_1 3 s_2 我想把它放在连接数据框中: source target freq s_1 s_2 2 s_1 s_3 1 s_2 s_3 1 我已经知道我可以使用plyr::count()计算频率,但是如何将数据重新流到源和目标类型?我相信您可以使用dplyr尝试这一点。如注释中所述,使用combn获取每个id中的成对组合。然后,按源和

我有以下形式的数据:

id state
1  s_1
1  s_2
1  s_3
2  s_1
2  s_3
3  s_1
3  s_2
我想把它放在连接数据框中:

source target freq
s_1    s_2    2
s_1    s_3    1
s_2    s_3    1

我已经知道我可以使用plyr::count()计算频率,但是如何将数据重新流到源和目标类型?

我相信您可以使用
dplyr
尝试这一点。如注释中所述,使用
combn
获取每个
id
中的成对组合。然后,按源和目标分组,您可以
总结
,并获得每个组合的频率

library(dplyr)

df %>%
  group_by(id) %>%
  do(as.data.frame(t(combn(.$state, m = 2)))) %>%
  setNames(c("id", "source", "target")) %>%
  group_by(source, target) %>%
  summarise(freq = n())
输出

  source target  freq
  <chr>  <chr>  <int>
1 s_1    s_2        2
2 s_1    s_3        2
3 s_2    s_3        1
源目标频率
1 s_1 s_2 2
2 s_1 s_3 2
3 s_2 s_3 1

我认为@Ben的解决方案是我们在这里能够实现的最清晰的解决方案,但为了勤奋,我根据注释和for循环创建了我的解决方案:

res <- data.frame(source=NA, target=NA)

for (i in 1:unique(df$id){
  df_grouped <- df[df$id == i,]
  for (j in 1:nrow(df_grouped)){
    source <- df_grouped[j, "state"]
    target <- df_grouped[j+1, "state"]
    res <- rbind(res, cbind(source,target))
  }
}
res <- res[complete.cases(res),]
res <- plyr::count(res)
res

res不是解决方案,而是一个开始:您正在寻找状态值之间所有可能的组合。然后循环这些组合并计算频率。R中有一个
combn
函数来获取组合。这可能会有帮助: