2016-09-09 5 views
1

Ich brauche etwas Hilfe. Ich habe die folgende Tabelle:R Anzahl der Strings durch zwei Faktoren

country_code=c(1,1,1,1,1,1,2,2,2,2,2,2) 
target=c('V1','V1','V2','V2','V3','V3','V1','V1','V2','V2','V3','V3') 
M1=c('X7','X7','X14','X14','X8','X8','X29','X22','X2','X22','X22','X22') 
M2=c('X1','X1','X17','X11','X21','X21','X1','X29','X8','X18','X24','X24') 
M3=c('NA','NA','NA','X1','NA','NA','NA','NA','NA','NA','NA','NA') 
CountofRun=c(1,2,1,2,1,2,1,2,1,2,1,2) 
df<-data.frame(country_code,target,M1,M2,M3,CountofRun) 

und ich möchte eine Frequenztabelle für jeden country_code und Ziel Kombination erhalten. So zum Beispiel, wenn X7 in allen drei Läufen erscheint für country_code = 1 und target = V1, X7 bis 3. summiert werden muss, wie Sie sehen, bin ich nur daran interessiert, das Zählen der Anzahl der Male, jeweils Die X1 bis X30 erscheinen in diesen 3 Läufen für jede von 6 Kombinationen von Country_Code und Target. Ich kann nicht zu numerisch konvertieren.

Die ultimative Tisch, hoffentlich wird so aussehen

enter image description here

+0

Gibt es einen Grund keine 'Tabelle zu verwenden, (df ​​$ country_code, df $ target) '? – jakub

+0

Hallo Steven und danke, dass du dir die Zeit genommen hast. Ich habe data.table und die einfache aggregate() Zusammenfassung() versucht und sogar versucht, compare() von einem anderen Paket zu verwenden. Ich glaube, dass die Lösung mit dplyr oder einer Version von apply liegen kann, aber ich bin verloren. –

+0

@jakub Dieser Code gibt nicht die Ausgabe, nach der ich bin. Tatsächlich werden die Informationen, die ich brauche, von der Ausgabe dieses Codes entfernt. Ich muss zählen, wie viel Zeit jede der X1 bis X30 für jede Kombination von country_code und Ziel erscheinen. –

Antwort

1

Vielleicht

library(dplyr) 
library(tidyr) 

df %>% 
    select(-CountofRun) %>% 
    gather(key, value, -(country_code:target)) %>% 
    select(-key) %>% 
    ftable(xtabs(~ country_code + target + value, data = .)) 

Welche gibt:

#     value NA X1 X11 X14 X17 X18 X2 X21 X22 X24 X29 X7 X8 
#country_code target              
#1   V1   2 2 0 0 0 0 0 0 0 0 0 2 0 
#    V2   1 1 1 2 1 0 0 0 0 0 0 0 0 
#    V3   2 0 0 0 0 0 0 2 0 0 0 0 2 
#2   V1   2 1 0 0 0 0 0 0 1 0 2 0 0 
#    V2   2 0 0 0 0 1 1 0 1 0 0 0 1 
#    V3   2 0 0 0 0 0 0 0 2 2 0 0 0 
+0

Das ist erstaunlich. Das funktioniert. Das einzige, was ich tun muss, ist, es einem Namen zuzuordnen und zu exportieren. –

-1

Diese Sie Weise wird es bekommen trennen; Sie zählt jetzt hat, ist es nur die Formatierung:

> library(data.table) 
> 
> country_code=c(1,1,1,1,1,1,2,2,2,2,2,2) 
> target=c('V1','V1','V2','V2','V3','V3','V1','V1','V2','V2','V3','V3') 
> M1=c('X7','X7','X14','X14','X8','X8','X29','X22','X2','X22','X22','X22') 
> M2=c('X1','X1','X17','X11','X21','X21','X1','X29','X8','X18','X24','X24') 
> M3=c('NA','NA','NA','X1','NA','NA','NA','NA','NA','NA','NA','NA') 
> CountofRun=c(1,2,1,2,1,2,1,2,1,2,1,2) 
> df<-data.table(country_code,target,M1,M2,M3,CountofRun) 
> 
> # melt the data for easier processing 
> df_m <- melt(df, id.vars = c('country_code', 'target', 'CountofRun')) 
> 
> # count 
> df_count <- df_m[, 
+    .(count = sum(CountofRun)), 
+    keyby = .(country_code, target, value) 
+    ][value != "NA"] # remove 'NA's 
>    
> df_count 
    country_code target value count 
1:   1  V1 X1  3 
2:   1  V1 X7  3 
3:   1  V2 X1  2 
4:   1  V2 X11  2 
5:   1  V2 X14  3 
6:   1  V2 X17  1 
7:   1  V3 X21  3 
8:   1  V3 X8  3 
9:   2  V1 X1  1 
10:   2  V1 X22  2 
11:   2  V1 X29  3 
12:   2  V2 X18  2 
13:   2  V2 X2  1 
14:   2  V2 X22  2 
15:   2  V2 X8  1 
16:   2  V3 X22  3 
17:   2  V3 X24  3 
> 
+0

Vielen Dank dafür. Aus irgendeinem Grund scheitert der df_count für mich mit dem Fehler "unused argument (keyby =. (Country_code, target, value))". Ich habe alle libs geladen. –

1

A data.table Lösung (ähnliche Struktur wie die dplyr + tidyr nur mit unterschiedlicher Syntax)

setDT(df) 
df[, .SD 
    ][, CountofRun := NULL 
    ][, melt(.SD, id.vars=c('country_code', 'target')) 
    ][, .N, .(country_code, target, value) 
    ][, dcast(.SD, country_code + target ~ value, value.var='N', fill=0) 
    ] 
Verwandte Themen