J'ai 2 tables, «transactions» avec plus de 500 millions de lignes et «clients» sur 3 millions de lignes
data <- data.frame(Trans = c(1,2,3,4,5), Cust01 = c("A","B","C","D","F"),
Cust02 = c("S","E","","TE","F"), Cust03 = c("F","","D","","F"))
cust_type <-data.frame(Cust = c("A","B","C","D"), Type = c("1","2","3","4"))
dataresult <- data.frame(Trans = c(1,2,3,4,5),
Cust01 = c("A","B","C","D","F"),
Cust01Type = c("1","2","3","4","5"),
Cust02 = c("S","E","","TE","F"),
Cust02Type = c("","","","",""),
Cust03 = c("F","","D","","F"),
Cust03Type = c("","","4","",""))
Je souhaite ajouter le type de client aux données de manière efficace. Normalement sql
, j'utiliserai plusieurs jointures à gauche, j'ai essayé cela avec dplyr
mais cela prend une éternité. J'ai également essayé d'utiliser %in%
avec un retour logique, puis une boucle juste pour me concentrer sur les vraies valeurs. Est-ce que quelqu'un connaît une meilleure façon de faire cela?
Lorsque vous voulez des performances rapides, rien ne vaut data.table
(encore) le package. Comme vos données de transaction sont désormais au format large, la première étape à faire est de les convertir en format long. Cela facilitera le traitement.
library(data.table) #v1.9.5
trans_data <- melt(setDT(data), id.vars = "Trans",
variable.name = "Cust", # set name variable column
variable.factor = TRUE, # set as a factor variable instead of a character variable
value.name = "Cvalue")[!Cvalue==""] # set name value column & remove empty cases
Lorsque vous avez fait cela, vous pouvez joindre les deux tables de données:
# set the keys by which you are joining
setDT(trans_data, key = "Cvalue")
setDT(cust_type, key = "Cust")
# join the customer type into the transaction data
trans_data[cust_type, Ctype:=Type]
cela donne:
> trans_data Trans Cust Cvalue Ctype 1: 1 Cust01 A 1 2: 2 Cust01 B 2 3: 3 Cust01 C 3 4: 4 Cust01 D 4 5: 3 Cust03 D 4 6: 2 Cust02 E NA 7: 5 Cust01 F NA 8: 5 Cust02 F NA 9: 1 Cust03 F NA 10: 5 Cust03 F NA 11: 1 Cust02 S NA 12: 4 Cust02 TE NA
Si vous souhaitez modifier l'ordre dans le résultat data.table
, vous pouvez le faire avec par exemple:
setorder(trans_data, Trans, Cust)
ou tout d'un coup avec:
trans_data <- trans_data[cust_type, Ctype:=Type][order(Trans,Cust)]
qui donne:
> trans_data Trans Cust Cvalue Ctype 1: 1 Cust01 A 1 2: 1 Cust02 S NA 3: 1 Cust03 F NA 4: 2 Cust01 B 2 5: 2 Cust02 E NA 6: 3 Cust01 C 3 7: 3 Cust03 D 4 8: 4 Cust01 D 4 9: 4 Cust02 TE NA 10: 5 Cust01 F NA 11: 5 Cust02 F NA 12: 5 Cust03 F NA
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots