簡體   English   中英

按R中一個向量的值對矩陣中的行進行分組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM