[英]Grouping rows in a matrix by the value of one vector in R
我正在使用一个看起来像这样的非常大的矩阵(VNUMBER是具有相应ID的人的特定访问次数):
ID VNUMBER
23 1
23 2
23 3
37 1
37 2
15 4
15 5
47 1
47 2
47 3
47 4
15 1
15 2
15 3
我想对所有行进行分组,以便按访问顺序排列具有相同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和vnum2向量创建一个具有所需格式的新矩阵。 但是必须有一些更简单的方法。 就像我说的那样,我正在使用的实际矩阵很大(大约100,000行和1,000列),所以上面的方法不可行,我想避免长循环。
抱歉,如果我的问题太长或措辞不当,这是我第一次使用该网站。 任何帮助都会很棒。
我们可以使用data.table
。 将'data.frame'转换为'data.table'( setDT(df1)
。在转换为factor
后,我们将'ID'列order
,方法是将level
设置为'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
或者我们可以使用match
。 如果初始数据集是matrix
,则
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
。 我们可以将矩阵转换为data.frame
df1 <- as.data.frame(m1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.