R 如何同时转置列和组

R 如何同时转置列和组,r,R,我的数据集如下: Pt EVENT 123 GGG 123 Nor 123 tre 144 GGG 1667 tre 1667 Nor 1667 tre source target value GGG Nor 1 GGG 1 tre tre 1 Nor tre 2 我试图最终为Sankey图表准备数据,为了做到这一点,我需

我的数据集如下:

Pt    EVENT
123    GGG
123    Nor
123    tre
144    GGG
1667   tre
1667   Nor
1667   tre
source    target   value
 GGG        Nor       1
 GGG                  1
 tre        tre       1
 Nor        tre       2
我试图最终为Sankey图表准备数据,为了做到这一点,我需要将数据转换为以下形状

Pt    
123   GGG      Nor   tre
144   GGG
1667  tre      Nor   tre
然后,我最终想到了一种源、目标、值格式,如下所示:

Pt    EVENT
123    GGG
123    Nor
123    tre
144    GGG
1667   tre
1667   Nor
1667   tre
source    target   value
 GGG        Nor       1
 GGG                  1
 tre        tre       1
 Nor        tre       2
我不明白的部分是如何从原始数据集到第二个数据集。我想我可以用dplyr来做,但没有乐趣:

  Sankey<-EndoSubset %>%
      group_by(Pt) %>% 
      select(t(EVENT))
我们可以使用data.table

我们可以使用data.table

这可以通过合成时间列来完成:

reshape(cbind(df,time=ave(seq_len(nrow(df)),df$Pt,FUN=seq_along)),dir='w',idvar='Pt');
##     Pt EVENT.1 EVENT.2 EVENT.3
## 1  123     GGG     Nor     tre
## 4  144     GGG    <NA>    <NA>
## 5 1667     tre     Nor     tre
资料

这可以通过合成时间列来完成:

reshape(cbind(df,time=ave(seq_len(nrow(df)),df$Pt,FUN=seq_along)),dir='w',idvar='Pt');
##     Pt EVENT.1 EVENT.2 EVENT.3
## 1  123     GGG     Nor     tre
## 4  144     GGG    <NA>    <NA>
## 5 1667     tre     Nor     tre
资料

以下是dplyr和tidyr解决方案:

library(dplyr)
library(tidyr)

data %>%
     group_by(Pt) %>%
     mutate(rn = 1:n()) %>%
     ungroup %>%
     spread(rn, EVENT)
以下是dplyr和tidyr解决方案:

library(dplyr)
library(tidyr)

data %>%
     group_by(Pt) %>%
     mutate(rn = 1:n()) %>%
     ungroup %>%
     spread(rn, EVENT)
另一种选择:

library(data.table)
l <- sapply(unique(df$Pt), function(x) data.frame(rbind(c(x,df[df$Pt==x,]$EVENT))))
rbindlist(l, fill = T)

     # X1  X2  X3  X4
# 1:  123 GGG Nor tre
# 2:  144 GGG  NA  NA
# 3: 1667 tre Nor tre
资料

另一种选择:

library(data.table)
l <- sapply(unique(df$Pt), function(x) data.frame(rbind(c(x,df[df$Pt==x,]$EVENT))))
rbindlist(l, fill = T)

     # X1  X2  X3  X4
# 1:  123 GGG Nor tre
# 2:  144 GGG  NA  NA
# 3: 1667 tre Nor tre
资料


转换为宽仅聚合每个Pt的值。阿克伦的回答正是我想要的。当SO允许我使用数据%>%group\U byPt%>%mutatern=1:n%>%ungroup%>%SPREBRRN时,我将在一分钟内接受dplyr和tidyr解决方案,EVENT@akrun谢谢你把这个包括进来。我把它作为一个答案放进去,但如果这不太好,因为它现在在这里,我将删除我的答案。@steveb我从我的帖子中删除了答案。@akrun谢谢。考虑到一系列事件,我将假设一切都是好的w.r.t。这是一个答案:-转换为宽只是聚合了每个Pt的值。阿克伦的回答正是我想要的。当SO允许我使用数据%>%group\U byPt%>%mutatern=1:n%>%ungroup%>%SPREBRRN时,我将在一分钟内接受dplyr和tidyr解决方案,EVENT@akrun谢谢你把这个包括进来。我把它作为一个答案放进去,但如果这不太好,因为它现在在这里,我将删除我的答案。@steveb我从我的帖子中删除了答案。@akrun谢谢。考虑到一连串的事件,我会假设一切都是好的,让它成为一个答案:-在这个问题和建议的副本之间有一个微妙的区别。本例中的重复地址是一个键列和一个值列,在本例中还有一个id列Pt。这个问题没有键列,只有值列;至少从原始数据帧到第一次转换,关键列将是组行号。akrun的回答解决了这个问题。我认为可能有一个不同的SO帖子来解决这个问题,但我还没有找到。这个问题和建议复制的链接之间有一个微妙的区别。本例中的重复地址是一个键列和一个值列,在本例中还有一个id列Pt。这个问题没有键列,只有值列;至少从原始数据帧到第一次转换,关键列将是组行号。akrun的回答解决了这个问题。我想可能会有一个不同的SO帖子来解决这个问题,不过我还没有找到。谢谢。从对话中我不确定我应该接受谁的回答,因为他们都有效。谢谢。从对话中我不确定我应该接受谁的回答,因为他们都有效。