按R中一个向量的值对矩阵中的行进行分组

按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的顺序对我来说并不重要,只要它

我使用的是一个非常大的矩阵,看起来像这样(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的顺序对我来说并不重要,只要它们是分组的,并且这些分组中相应的就诊号码是升序的

到目前为止,我所能想到的就是使用以下方法创建一个新的矩阵:

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,您的解决方案非常好,因为我感兴趣,而且非常合理。谢谢谢谢你的帮助。