2013-01-21 53 views
4

我想根據列查找矩陣的頻率。例如用於以下查找矩陣或數據幀中每個唯一列的頻率

x <- matrix(c(rep(1:4,3),rep(2:5,2)),4,5) 
    x 
     [,1] [,2] [,3] [,4] [,5] 
    [1,] 1 1 1 2 2 
    [2,] 2 2 2 3 3 
    [3,] 3 3 3 4 4 
    [4,] 4 4 4 5 5 

現在矩陣X怎樣才能找到每個唯一列的頻率,並創建一個矩陣,每列是x的唯一列和最後一行添加爲它在矩陣X

頻率
#freqmatrix 
     [,1] [,2] 
[,1]  1 2 
[,2]  2 3 
[,3]  3 4 
[,4]  4 5 
[,5]  3 2 

回答

2

你最終的目標是什麼?換句話說,你將如何進一步處理這些數據?如果它只是製表符,那麼paste()不會讓你得到答案嗎?

x <- matrix(c(rep(1:4,3),rep(2:5,2)),4,5) 
x1 <- data.frame(table(apply(x, 2, paste, collapse = ", "))) 
#   Var1 Freq 
# 1 1, 2, 3, 4 3 
# 2 2, 3, 4, 5 2 

如果你想Var1分離的,可以在該列中使用read.csv()

cbind(read.csv(text = as.character(x1$Var1), header = FALSE), x1[-1]) 
# V1 V2 V3 V4 Freq 
# 1 1 2 3 4 3 
# 2 2 3 4 5 2 

或者,如果你喜歡你的轉輸出:

t(cbind(read.csv(text = as.character(x1$Var1), header = FALSE), x1[-1])) 
#  [,1] [,2] 
# V1  1 2 
# V2  2 3 
# V3  3 4 
# V4  4 5 
# Freq 3 2 
+0

你的解決方案和其他人一樣好。謝謝 – morteza

2

這個答案會有點亂,因爲它涉及到列表的列表,我無法避免:

x <- matrix(c(rep(1:4,3),rep(2:5,2)),4,5) 
#convert columns to elements in list 
y <- apply(x, 2, list) 

#Get unique columns 
unique_y <- unique(unlist(y, recursive=FALSE)) 

#Get column frequencies 
frequencies <- sapply(unique(y), function(f) sum(unlist(y, recursive=FALSE) %in% f)) 

#Bind unique columns with frequencies 
rbind(simplify2array(unique_y), frequencies) 

看哪:

  [,1] [,2] 
       1 2 
       2 3 
       3 4 
       4 5 
frequencies 3 2 
+0

您的解決方案是混亂,但有趣的。非常感謝 – morteza

5

這裏是一個解決方案避免了矩陣轉換成一個列表的列表,但它也是一個有點混亂:

x.unique <- unique(x, MARGIN = 2) 

freq <- apply(x.unique, MARGIN = 2, 
       function(b) sum(apply(x, MARGIN = 2, function(a) all(a == b))) 
     ) 

rbind(x.unique, freq) 

    [,1] [,2] 
     1 2 
     2 3 
     3 4 
     4 5 
freq 3 2 
+0

感謝您的回答 – morteza

2

一個襯墊使用aggregate(如果您的輸入是data.frame):

y <- matrix(c(1:4, 2:5, 1:4, 1,3,4,5, 2:5), ncol=5) 
> y 
#  [,1] [,2] [,3] [,4] [,5] 
# [1,] 1 2 1 1 2 
# [2,] 2 3 2 3 3 
# [3,] 3 4 3 4 4 
# [4,] 4 5 4 5 5 

z <- as.data.frame(t(y)) 
> t(aggregate(z, by=z, length)[1:(ncol(z)+1)]) 
#  [,1] [,2] [,3] 
# V1  1 1 2 
# V2  2 3 3 
# V3  3 4 4 
# V4  4 5 5 
# V1.1 2 1 2 

注:該解決方案將是快,如果你輸入矩陣x列數比其更大NROWS,即ncol(x) >> nrow(x)

+0

非常感謝。它比其他人快得多 – morteza

+1

謝謝,因爲我的數據量很大,你的通知很好。 – morteza

相關問題