按R中一个向量的值对矩阵中的行进行分组
我使用的是一个非常大的矩阵,看起来像这样(VNUMBER是具有相应ID的人的特定访问次数): 我想对所有行进行分组,以便按访问顺序排列具有相同ID号的块。对于本例,我想重新排列矩阵,以便ID=15的所有行按VNUMBER顺序排列在一起,因此生成的矩阵如下所示:按R中一个向量的值对矩阵中的行进行分组,r,sorting,matrix,vector,grouping,R,Sorting,Matrix,Vector,Grouping,我使用的是一个非常大的矩阵,看起来像这样(VNUMBER是具有相应ID的人的特定访问次数): 我想对所有行进行分组,以便按访问顺序排列具有相同ID号的块。对于本例,我想重新排列矩阵,以便ID=15的所有行按VNUMBER顺序排列在一起,因此生成的矩阵如下所示: ID VNUMBER 23 1 23 2 23 3 37 1 37 2 15 1 15 2 15 3 15 4 15 5 47 1 47 2 47 3 47 4 如您所见,ID的顺序对我来说并不重要,只要它
ID VNUMBER
23 1
23 2
23 3
37 1
37 2
15 1
15 2
15 3
15 4
15 5
47 1
47 2
47 3
47 4
如您所见,ID的顺序对我来说并不重要,只要它们是分组的,并且这些分组中相应的就诊号码是升序的
到目前为止,我所能想到的就是使用以下方法创建一个新的矩阵:
id2 <- sort(ID)
f <- as.numeric(levels(factor(ID)))
vnum2 <- c(VNUMBER[ID==f[1]],VNUMBER[ID==f[2]],VNUMBER[ID==f[3]],VNUMBER[ID==f[4]])
id2我们可以使用data.table
。将'data.frame'转换为'data.table'(setDT(df1)
。我们order
将'ID'列转换为factor
后,将级别设置为'ID'的unique
元素,后跟'VNUMBER'。这将得到OP帖子中显示的预期输出
library(data.table)
setDT(df1)[order(factor(ID, levels=unique(ID)), VNUMBER)]
# ID VNUMBER
# 1: 23 1
# 2: 23 2
# 3: 23 3
# 4: 37 1
# 5: 37 2
# 6: 15 1
# 7: 15 2
# 8: 15 3
# 9: 15 4
#10: 15 5
#11: 47 1
#12: 47 2
#13: 47 3
#14: 47 4
或者我们可以使用匹配
。如果初始数据集是矩阵
,则
m1[order(match(m1[,'ID'], unique(m1[,'ID'])), m1[,'VNUMBER']),]
# ID VNUMBER
#1 23 1
#2 23 2
#3 23 3
#4 37 1
#5 37 2
#12 15 1
#13 15 2
#14 15 3
#6 15 4
#7 15 5
#8 47 1
#9 47 2
#10 47 3
#11 47 4
使用dplyr
的类似方法如下
library(dplyr)
df1 %>%
arrange( match(ID, unique(ID)), VNUMBER)
注意:dplyr/data.table
方法都假定初始数据集为data.frame
。我们可以通过
df1 <- as.data.frame(m1)
df1我们可以使用data.table
。将'data.frame'转换为'data.table'(setDT(df1)
。我们将级别设置为唯一的“ID”元素,然后设置为“VNUMBER”,从而在转换为因子后对“ID”列进行排序。这将给出OP帖子中显示的预期输出
library(data.table)
setDT(df1)[order(factor(ID, levels=unique(ID)), VNUMBER)]
# ID VNUMBER
# 1: 23 1
# 2: 23 2
# 3: 23 3
# 4: 37 1
# 5: 37 2
# 6: 15 1
# 7: 15 2
# 8: 15 3
# 9: 15 4
#10: 15 5
#11: 47 1
#12: 47 2
#13: 47 3
#14: 47 4
或者我们可以使用匹配
。如果初始数据集是矩阵
,则
m1[order(match(m1[,'ID'], unique(m1[,'ID'])), m1[,'VNUMBER']),]
# ID VNUMBER
#1 23 1
#2 23 2
#3 23 3
#4 37 1
#5 37 2
#12 15 1
#13 15 2
#14 15 3
#6 15 4
#7 15 5
#8 47 1
#9 47 2
#10 47 3
#11 47 4
使用dplyr
的类似方法如下
library(dplyr)
df1 %>%
arrange( match(ID, unique(ID)), VNUMBER)
注意:dplyr/data.table
方法都假定初始数据集为data.frame
。我们可以通过
df1 <- as.data.frame(m1)
df1您应该查看dplyr
包。您可以执行类似的操作:my_matrix%>%groupu\u by(ID)%%>%arrange(ID,VNUMBER)
m[顺序(m[,“ID”],m[,“VNUMBER”]),]
可能会这样做,但它会按照从最低ID开始的顺序进行,这实际上可能会更好地提高数据的可读性。这两种方法都很好。我不熟悉dplyr软件包,所以我会检查它。Richard,您的解决方案非常好,因为我感兴趣,而且非常合理。谢谢非常感谢您的帮助。您应该查看dplyr
包。您可以执行类似的操作:my_matrix%>%groupu\u by(ID)%%>%arrange(ID,VNUMBER)
m[顺序(m[,“ID”],m[,“VNUMBER”]),]
可能会这样做,但它会按照从最低ID开始的顺序进行,这实际上可能会更好地提高数据的可读性。这两种方法都很好。我不熟悉dplyr软件包,所以我会检查它。Richard,您的解决方案非常好,因为我感兴趣,而且非常合理。谢谢谢谢你的帮助。