2016-06-07 11 views
3

Ich versuche, Triplets zu zählen; dafür verwende ich drei Vektoren, die in einem Datenrahmen gepackt sind:Mit Tabelle zählen() und 0 ausschließen

X=c(4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,3)    
Y=c(1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,4,2,2,2,2,3,4,1,1,2,2,3,3,4,4) 
Z=c(4,4,5,4,4,4,4,4,6,1,1,1,1,1,1,1,2,2,2,2,7,2,3,3,3,3,3,3,3,3) 


Count_Frame=data.frame(matrix(NA, nrow=(length(X)), ncol=3)) 

Count_Frame[1]=X 
Count_Frame[2]=Y 
Count_Frame[3]=Z 

Counts=data.frame(table(Count_Frame)) 

Es gibt folgendes Problem: Wenn ich den Wertebereich in den Vektoren erhöhen oder sogar mehr Vektoren, welche die „Counts“ Datenrahmen schnell die Größenbeschränkung verwenden Ansätze aufgrund der vielen 0-Zählungen. Gibt es eine Möglichkeit, die 0-Zählungen während der Generierung von "Counts" auszuschließen?

+0

Wollen Sie Häufigkeit von uniq Row-Kombinationen? – Gopala

Antwort

2

Sie erreichen dies mit aggregate:

Count_Frame$one <- 1 
aggregate(one ~ X1 + X2 + X3, data=Count_Frame, FUN=sum) 

Dies wird die positiven Instanzen table berechnen, aber die Null zählt nicht auflisten.

2

Eine Lösung ist eine Kombination der Spaltenwerte zu erstellen und diese stattdessen zählen:

library(tidyr) 
as.data.frame(table(unite(Count_Frame, tmp, X1, X2, X3))) %>% 
    separate(Var1, c('X1', 'X2', 'X3')) 

resultierende Ausgabe ist:

X1 X2 X3 Freq 
1 1 1 1 3 
2 1 1 6 1 
3 1 2 1 2 
4 1 3 1 1 
5 1 4 1 1 
6 2 2 2 4 
7 2 3 7 1 
8 2 4 2 1 
9 3 1 3 2 
10 3 2 3 2 
11 3 3 3 2 
12 3 4 3 2 
13 4 1 4 7 
14 4 1 5 1 
3

Wir data.table verwenden können. Konvertieren Sie den 'data.frame' in 'data.table' (setDT(Count_Frame)), gruppiert nach allen Spalten (.(X, Y, Z)), erhalten wir die Anzahl oder Zeilen (.N).

library(data.table) 
setDT(Count_Frame)[,.N ,.(X, Y, Z)] 
# X Y Z N 
# 1: 4 1 4 7 
# 2: 4 1 5 1 
# 3: 1 1 6 1 
# 4: 1 1 1 3 
# 5: 1 2 1 2 
# 6: 1 3 1 1 
# 7: 1 4 1 1 
# 8: 2 2 2 4 
# 9: 2 3 7 1 
#10: 2 4 2 1 
#11: 3 1 3 2 
#12: 3 2 3 2 
#13: 3 3 3 2 
#14: 3 4 3 2 

Statt alle Spalten zu benennen, können wir names(Count_Frame) verwenden als auch (wenn es viele Spalten sind)

setDT(Count_Frame)[,.N , names(Count_Frame)] 
2

Oder mit plyr:

library(plyr) 
count(Count_Frame, colnames(Count_Frame)) 

Ausgang

# > count(Count_Frame, colnames(Count_Frame)) 
    # X1 X2 X3 freq 
# 1 1 1 1 3 
# 2 1 1 6 1 
# 3 1 2 1 2 
# 4 1 3 1 1 
# 5 1 4 1 1 
# 6 2 2 2 4 
# 7 2 3 7 1 
# 8 2 4 2 1 
# 9 3 1 3 2 
# 10 3 2 3 2 
# 11 3 3 3 2 
# 12 3 4 3 2 
# 13 4 1 4 7 
# 14 4 1 5 1