2017-06-21 6 views
1

Dies ist ein Teil des Feature-Engineering, der jede ID abhängig von der Spalte mit der Bezeichnung Col zusammenfasst. Derselbe Vorprozess wird auf den Testsatz angewendet. Da die Datenmenge groß ist, kann die datenbasierte Lösung bevorzugt werden.So erhalten Sie eine schnelle Zusammenfassung der Anzahl in data.table

Training Input:

ID Col 
A M 
A M 
A M 
B K 
B M 

Erwartete Ausgabe für über Trainingseingang:

ID Col_M Col_K 
A 3  0  # A has 3 M in Col and 0 K in Col 
B 1  1 

Oben ist für Trainingsdaten zu verarbeiten. Zum Testen des Datasets ist eine Zuordnung über Col_M, Col_K erforderlich, dh wenn ein anderer Wert wie S in Col erscheint, wird er ignoriert.

Testing Input:

ID Col 
C M 
C S 

Erwartete Ausgabe für über Testeingang:

ID Col_M Col_K 
C 1  0  # A has 1 M in Col and 0 K in Col. S value is ignored 
+0

können Sie einige Absätze auf, zu erklären, was gezeigt wird? Dummy-Code kann helfen, gute Antworten zu erstellen :) – pachamaltese

+0

Wenn Sie tatsächlich R installiert haben, und die data.table Paket auch, gibt es das: https://stackoverflow.com/q/18881073/ Definieren Sie einfach Ihre eigenen 'inds' Werte. – Frank

+0

@pachamaldese, ja, gerade hinzugefügt. – HappyCoding

Antwort

1

Ein möglicher data.table Implementierung könnte zuerst Filter von c("M", "K"), dann fügen Sie diese Ebene (falls sie nicht vorhanden sind, wie in Ihrem zweiten Fall), dann läuft dcast während Angabe drop = FALSE, fill = 0L (für die Fälle, wenn eine der gewünschten Ebenen fehlt) während der Angabe fun = length (um zu zählen).

Prüfung auf beiden Datensätze

library(data.table) 

### First example 
df <- fread("ID Col 
A M 
A M 
A M 
B K 
B M") 

dcast(df[Col %in% c("M", "K")], # Work only with c("M", "K") 
     ID ~ factor(Col, levels = union(unique(Col), c("M", "K"))), # Add missing levels 
     drop = FALSE, # Keep missing levels in output 
     fill = 0L, # Fill missing values with zeroes instead of NAs 
     fun = length) # Count. you can also specify 'value.var' 

# ID M K 
# 1: A 3 0 
# 2: B 1 1 

### Second example 
df <- fread("ID Col 
C M 
C S") 

dcast(df[Col %in% c("M", "K")], 
    ID ~ factor(Col, levels = union(unique(Col), c("M", "K"))), 
    drop = FALSE, 
    fill = 0L, 
    fun = length) 

# ID M K 
# 1: C 1 0 
+0

Danke für Ihre Antwort und detaillierte Erklärung. Die Lösung ist allgemein genug. Können Sie über zwei Erweiterungen teilnehmen? – HappyCoding

+0

Sie verwandeln dies in eine [Chamäleon-Frage] (https://meta.stackoverflow.com/questions/266767/what-ist-the-best-way-to-ask-follow-up-questions). Sie können keine neuen Änderungen hinzufügen, nachdem Sie eine Antwort erhalten haben. Hinzufügen einer Fensterfunktion eine ganz neue Frage. –

+0

danke für den Vorschlag. bitte finden Sie die neue Frage unter https://stackoverflow.com/questions/44688711/how-to-get-quick-summary-in-data-table-with-a-look-back-window – HappyCoding

0

Ich bin nicht sicher, wie groß Ihre Daten sind und wie flexibel die erwartete Code sein sollte, aber ich habe diese :

zz = ' 
ID Col 
A M 
A M 
A M 
B K 
B M 
' 

df <- read.table(text = zz, header = TRUE) 
col = as.data.frame(table(df)) 

out <- reshape(col, idvar = "ID", 
       timevar = "Col", direction = "wide") 
out 

, die Sie gibt:

> out 
    ID Freq.K Freq.M 
1 A  0  3 
2 B  1  1 

Und für den zweiten Datenrahmen:

yy = ' 
ID Col 
C M 
C S 
' 

df1 <- read.table(text = yy, header = TRUE) 
col1 = as.data.frame(table(df1)) 

out1 <- reshape(col1, idvar = "ID", 
       timevar = "Col", direction = "wide") 
out1 

Sie erhalten:

> out1 
    ID Freq.M Freq.S 
1 C  1  1 

sie gerade miteinander verschmelzen dann und löschen Sie die redundante:

ss = merge(out1, out, all.y = T, all.x = T) 
ss 
    ID Freq.M Freq.S Freq.K 
1 C  1  1  NA 
2 A  3  NA  0 
3 B  1  NA  1 
+0

Ihre gewünschte Ausgabe enthält keine Spalte "S". –

+0

Das stimmt. Ich warte auf einen Kommentar, ob das OK war oder nicht. Dann würde ich das letzte Bit des Codes bearbeiten, um "S" Col und Sub "NAs" auf "0" zu setzen. – AK88

0
> library(data.table) 
> dt=NULL 
> dt$ID=c("A","A","A","B","B") 
> dt$Col=c("M","M","M","K","M") 
> dt=data.frame(dt) 
> dt=data.table(dt) 
> dt 
    ID Col 
1: A M 
2: A M 
3: A M 
4: B K 
5: B M 


> a=dt[Col=="M",sum(.N),ID] 
> b=dt[Col=="K",sum(.N),ID] 
> a 
    ID V1 
1: A 3 
2: B 1 
> b 
    ID V1 
1: B 1 
> setkey(a,ID) 
> setkey(b,ID) 

> m=b[a] 
> m 
    ID V1 i.V1 
1: A NA 3 
2: B 1 1 
> names(m)=c("ID","Col_K","Col_M") 
> m 
    ID Col_K Col_M 
1: A NA  3 
2: B  1  1 
+0

used data.table Code zur Auswahl und Zusammenführung aufgrund von Big Data Bedenken –

+0

Funktioniert das auch für das zweite Beispiel? –

+0

es sollte seit Auswahl ist nur für M und K, vor der Zusammenführung –

Verwandte Themen