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