2016-06-20 64 views
0

我有一個包含大量重複項的矩陣,並希望獲得具有唯一行和每個唯一行的頻率計數的矩陣。重複行的計數頻率

下面顯示的例子解決了這個問題,但是速度很慢。

rowsInTbl <- function(tbl,row){ 
    sum(apply(tbl, 1, function(x) all(x == row))) 
} 

colFrequency <- function(tblall){ 
    tbl <- unique(tblall) 
    results <- matrix(nrow = nrow(tbl),ncol=ncol(tbl)+1) 
    results[,1:ncol(tbl)] <- as.matrix(tbl) 
    dimnames(results) <- list(c(rownames(tbl)),c(colnames(tbl),"Frequency")) 

    freq <- apply(tbl,1,function(x)rowsInTbl(tblall,x)) 
    results[,"Frequency"] <- freq 
    return(results) 
} 


m <- matrix(c(1,2,3,4,3,4,1,2,3,4),ncol=2,byrow=T) 
dimnames(m) <- list(letters[1:nrow(m)],c("c1","c2")) 
print("Matrix") 
print(m) 

[1] "Matrix" 
    c1 c2 
a 1 2 
b 3 4 
c 3 4 
d 1 2 
e 3 4 

print("Duplicate frequency table") 
print(colFrequency(m)) 


[1] "Duplicate frequency table" 
    c1 c2 Frequency 
a 1 2   2 
b 3 4   3 

這裏是@Heroka和@ m0h3n答案的速度測量結果與我的例子相比。上面顯示的矩陣重複了1000次。 Data.table顯然是最快的解決方案。

[1] "Duplicate frequency table - my example" 
    user system elapsed 
    0.372 0.000 0.371 

[1] "Duplicate frequency table - data.table" 
    user system elapsed 
    0.008 0.000 0.008 

[1] "Duplicate frequency table - aggregate" 
    user system elapsed 
    0.092 0.000 0.089 
+0

在我看來,這個問題的不同之約的問題應用函數,因爲這裏的問題是,一個大的數據集應用功能太慢,需要不同的方法 – scs

+0

是的,對不起,我貼了這個wron g鏈接:參見[this one](http://stackoverflow.com/questions/1660124/how-to-sum-a-variable-by-group),它是按總和分組的,但想法是一樣的。 – zx8754

+1

我檢查了鏈接,並確認重複 – scs

回答

4

看起來像data.table的工作,因爲您需要可以快速聚合的東西。

library(data.table) 


m <- matrix(c(1,2,3,4,3,4,1,2,3,4),ncol=2,byrow=T) 

mdt <- as.data.table(m) 

res <- mdt[,.N, by=names(mdt)] 
res 
# > res 
# V1 V2 N 
# 1: 1 2 2 
# 2: 3 4 3 
+0

所有答案的最快解決方案。速度測量添加到問題中。 – scs

2

這樣如何使用base的R用提取的唯一行:

mat <- matrix(c(2,5,3,5,2,3,4,2,3,5,4,2,1,5,3,5), ncol = 2, byrow = T) 
mat[!duplicated(mat),] 

    # [,1] [,2] 
# [1,] 2 5 
# [2,] 3 5 
# [3,] 2 3 
# [4,] 4 2 
# [5,] 1 5 

提取與它們的頻率沿着唯一的行:

m <- as.data.frame(mat) 
aggregate(m, by=m, length)[1:(ncol(m)+1)] 

    # V1 V2 V1.1 
# 1 4 2 2 
# 2 2 3 1 
# 3 1 5 1 
# 4 2 5 1 
# 5 3 5 3