通过R

时间:2015-10-23 20:45:30

标签: r sorting matrix vector grouping

我正在使用一个非常大的矩阵,看起来像这样(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列),所以上面的方法是不可行的,我想避免长循环。

很抱歉,如果我的问题太长或措辞不够,这是我第一次使用该网站。任何帮助都会很棒。

1 个答案:

答案 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。我们可以通过

将矩阵转换为data.frame
df1 <- as.data.frame(m1)