J'essaie de trouver un moyen efficace (et idéalement bien rangé) de traiter une paire de trames de données groupées. La configuration ressemble plus ou moins comme ceci:technique efficace ridy R pour le traitement des groupes de trames de données alignées
A = crossing(idx=1:1e5, asdf=seq(1:rpois(1,50))
B = tbl(idx=sample(1:1e5, replace=TRUE), yet_more_stuff='whatever')
proc_one_group <- function(one_A, one_b) { ... }
# example:
proc_one_group(filter(A, idx==50), filter(B, idx==50))
Ainsi, mon opération de traitement, ce qui est assez complexe, fonctionne sur un idx
à la fois, à partir de deux trames de données séparées, où l'un d'entre eux a un ou plus (généralement des dizaines) lignes par idx
, et l'autre peut avoir zéro, une ou plusieurs lignes par idx
.
Une façon que je sais que je peux faire ceci est ceci, mais c'est très lent, parce que l'opération filter
sur chaque valeur exige un balayage complet de table et un sous-ensemble.
map_df(unique(A$idx), ~ proc_one_group(filter(A, idx==.), filter(B, idx==.)))
Je sais aussi que je peux utiliser split
pour créer une liste de sous-trames de data_frames relativement efficace, mais je ne sais pas une bonne façon de le faire alors O (1) par l'indice des recherches les deux data_frame
s.
Ce que je sorte de veux est la première étape d'un left_join
, où il figure les sous-groupes d'index de chaque groupe, mais au lieu de créer réellement un seul data_frame
de la combinaison cartésienne de chaque groupe, il me donne juste la paire de sous-groupes que je peux traiter au besoin. (Un plein left_join
ne m'aide pas ici.)
Des idées?
Oh, très intelligent. Oui, cela fait la partie correspondante de la jointure, sans réellement faire la jointure. – Harlan