我正在使用一个非常大的矩阵,看起来像这样(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列),所以上面的方法是不可行的,我想避免长循环。
很抱歉,如果我的问题太长或措辞不够,这是我第一次使用该网站。任何帮助都会很棒。
答案 0 :(得分:0)
我们可以使用data.table
。将'data.frame'转换为'data.table'(setDT(df1)
。转换为order
后,我们factor
'ID'列,将level
设为unique
{1}}'ID'的元素,后跟'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
。我们可以通过
df1 <- as.data.frame(m1)