Ho due frame di dati, "dati" e "colonne sonore", e desidera unire loro sulla colonna "id":Selezionare solo la prima riga quando si uniscono i frame di dati con più partite
data = data.frame(id = c(1,2,3,4,5),
state = c("KS","MN","AL","FL","CA"))
scores = data.frame(id = c(1,1,1,2,2,3,3,3),
score = c(66,75,78,86,85,76,75,90))
merge(data, scores, by = "id")
semi_join(data, scores, by = "id")
Nel i "punteggi" dati, ci sono "ID" con più osservazioni, in cui ogni corrispondenza ottiene una riga dopo il join. Vedi ?merge
:
Se c'è più di una corrispondenza, tutte le corrispondenze possibili contribuiscono con una riga ciascuna.
Tuttavia, voglio tenere solo la riga corrispondente al primo partita dalla tabella scores
.
Un semi join sarebbe stato bello, ma non sono in grado di selezionare il punteggio dalla tabella giusta.
Qualche suggerimento?
Che ne dici di usare un 'score' key.table.table:' setDT (data); punteggi <- data.table (punteggi, chiave = "id"); unique (scores) [data, nomatch = 0L] ' – mtoto
Funzionerebbe bene, ma è solo molto inefficiente. 'data.table()' produce una copia profonda. L'argomento chiave dovrebbe riordinare l'intero dato.tabella (inefficiente a meno che non si possa fare caso per il riutilizzo e probabilmente indesiderabile). 'unique()' genera dati intermedi non necessari. E 'on =' consente anche una sintassi pulita per solo guardarlo e capire cosa è la colonna di join (anche se può essere utilizzato anche su dati key.tables). Raccomando di leggere la vignetta [indici secondari] (https://github.com/Rdatatable/data.table/wiki/Getting-started). – Arun