2016-04-13 11 views
2

I zwei Datentabellen haben, wie unten gezeigt:
BigrammeNachschlagdaten in einer Datentabelle hinzuzufügen, um eine neue Spalte

w1w2   freq w1   w2  
common names 1  common  names 
department of 4  department of 
family name 6  family  name 

bigrams = setDT(structure(list(w1w2 = c("common names", "department of", "family name" 
), freq = c(1L, 4L, 6L), w1 = c("common", "department", "family" 
), w2 = c("names", "of", "name")), .Names = c("w1w2", "freq", 
"w1", "w2"), row.names = c(NA, -3L), class = "data.frame")) 

Unigramme

w1   freq 
common  2 
department 3 
family  4 
name   5 
names   1 
of   9 

unigrams = setDT(structure(list(w1 = c("common", "department", "family", "name", 
"names", "of"), freq = c(2L, 3L, 4L, 5L, 1L, 9L)), .Names = c("w1", 
"freq"), row.names = c(NA, -6L), class = "data.frame")) 

gewünschten Ausgang

w1w2   freq w1   w2  w1freq w2freq 
common names 1  common  names 2   1 
department of 4  department of  3   9 
family name 6  family  name 4   5 

Was ich Das gibt mir bisher

setkey(bigrams, w1) 
setkey(unigrams, w1) 
result <- bigrams[unigrams] 

die i.freq Spalte für w1 getan haben, aber wenn ich versuche, für w2 das gleiche tun die i.freq Spalte aktualisiert wird, um die Frequenz von w2 zu reflektieren.

Wie bekomme ich freq für beide w1 und w2 in separaten Spalten?

Hinweis: Ich habe schon mit ein wenig Umformung gesehen Lösungen data.table Lookup value and translate und Modify column of a data.table based on another column and add the new column

+0

Suchen Sie eine data.table-Lösung? Ansonsten sollte das funktionieren: bigrams $ w1freq <- unigrams $ freq [match (bigrams $ w1, unigrams $ w1)]; Bigramme $ w2freq <- Unigramme $ freq [Übereinstimmung (Bigramme $ w2, Unigramme $ w1)]; – chinsoon12

+0

@ chinsoon12 Ja, ich würde es lieber mit data.table lösen, da ich die Lösung für größere Datenmengen verwenden möchte. –

+0

ist Ihre 'freq' Spalte in Ihrer gewünschten Ausgabe korrekt? – SymbolixAU

Antwort

3

Sie können zwei Joins durchführen, und in v1.9.6 von data.table können Sie das Argument on= für unterschiedliche Spaltennamen angeben.

library(data.table) 

bigrams[unigrams, on=c("w1"), nomatch = 0][unigrams, on=c(w2 = "w1"), nomatch = 0] 

      w1w2 freq   w1 w2 i.freq i.freq.1 
1: family name 6  family name  4  5 
2: common names 1  common names  2  1 
3: department of 4 department of  3  9 
2

Sie dies tun können.

library(dplyr) 
library(tidyr) 

bigrams %>% 
    rename(w1w2_string = w1w2, 
     w1w2_freq = freq) %>% 
    gather(order, string, 
     w1, w2) %>% 
    left_join(unigrams %>% 
       rename(string = w1)) %>% 
    gather(type, value, 
     string, freq) %>% 
    unite(order_type, order, type) %>% 
    spread(order_type, value) 

Edit: Erläuterung

Die erste Beobachtung Sie machen können, ist, dass Bigrams enthält in der Tat Informationen über drei verschiedene Analyseeinheiten: ein Bigramm und zwei Unigramme. In lange Form konvertieren, so dass die Analyseeinheit ein Unigramm ist. Dann können wir die anderen Unigrammdaten zusammenführen. Beachten Sie, dass Ihr Unigramm zwei verschiedene Informationen pro Zeile enthält: die Häufigkeit für das Unigramm und den Text des Unigramms. Konvertiere wieder in eine lange Form, so dass die Analyseeinheit eine Information über ein Unigramm ist. Jetzt verbreiten, so dass jede neue Spalte eine Art von Informationen über ein Unigramm ist.

+0

Könntest du bitte die Lösung ein wenig erklären? –

+0

siehe Erklärung – bramtayl

Verwandte Themen