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帖子来解决这个问题,不过我还没有找到。谢谢。从对话中我不确定我应该接受谁的回答,因为他们都有效。谢谢。从对话中我不确定我应该接受谁的回答,因为他们都有效。