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
函数来获取组合。这可能会有帮助: