/ / Zliczaj częstotliwość zduplikowanych wierszy [duplikat] - r, macierz

Policz częstotliwość powtarzających się wierszy [duplikuj] - r, macierz

Mam matrycę z dużą liczbą duplikatów i chciałbym uzyskać macierz z unikalnymi wierszami i zliczeniem częstotliwości do każdego unikalnego wiersza.

Poniższy przykład rozwiązuje ten problem, ale jest boleśnie powolny.

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

Oto pomiary prędkości odpowiedzi @Heroka i @ m0h3n w porównaniu z moim przykładem. Macierz pokazana powyżej została powtórzona 1000 razy. Data.table jest zdecydowanie najszybszym rozwiązaniem.

[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

Odpowiedzi:

5 dla odpowiedzi № 1

Wygląda jak praca dla data.table, ponieważ potrzebujesz czegoś, co szybko się agreguje.

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

2 dla odpowiedzi nr 2

Jak o tym użyć base R do wyodrębniania unikalnych wierszy:

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

Wyodrębnianie unikalnych wierszy wraz z ich częstotliwościami:

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