J'ai ce qui semble être un problème assez difficile à vectoriser/accélérer. Je suis capable de résoudre le problème avec une boucle forcée imbriquée qui évolue lentement. Les données avec lesquelles je travaille sont les données de possession de la NBA, et je les analyse sur plusieurs lignes de la NBA (100K - 1M), ce qui est très lent (plusieurs minutes) dans ma boucle imbriquée. J'ai créé des données de test pour mettre en évidence le problème:Manipulation de données difficile pour remplir des valeurs dans une trame R
mydf = data.frame(id1 = c(100, 100, 100, 150, 150, 150),
id2 = c(110, 110, 110, 122, 122, 122),
P1 = c(1, 1, 1, 1, 2, 2),
P2 = c(2, 2, 2, 3, 3, 3),
O1 = c(4, 4, 4, 4, 4, 4),
O2 = c(5, 5, 6, 6, 6, 6),
A1 = 0,
A2 = 0,
A3 = 0,
A4 = 0,
A5 = 0,
A6 = 0)
Il y a 6 utilisateurs uniques dans cette trame de données, (1-6), et leurs papiers d'identité apparaissent dans les colonnes P1, P2, O1 et O2. Chaque utilisateur a également sa propre colonne (A1-A6). Chaque fois qu'un utilisateur apparaît dans une rangée dans les colonnes P1 ou P2, sa colonne respective obtient un 1. Chaque fois qu'un utilisateur apparaît dans une rangée dans les colonnes O1 ou O2, sa colonne respective obtient un -1. Mon boucle for pour résoudre ce problème est la suivante:
for (i in 1:nrow(mydf)) {
for (j in 3:4) {
tmp = paste0("A",as.character(mydf[i,j]))
mydf[i, which(colnames(mydf) == tmp)] = 1
}
for (j in 5:6) {
tmp = paste0("A",as.character(mydf[i,j]))
mydf[i, which(colnames(mydf) == tmp)] = -1
}
}
Mon dataframe réelle a P1-P5, O1-O5 et environ 300 ID de joueur uniques. Des pensées sur comment je peux accélérer cela?
Merci!
NB, je ne suis pas sûr du résultat attendu si un identifiant de joueur se trouve dans plusieurs colonnes P/O. La première version a un maximum de 1, tout négatif et tout positif donnera 0. Le second ajoute plutôt tous les +/- 1. –
Salut Chris, apprécie l'aide avec ça. Il semble que la première approche devrait avoir des barres simples | plutôt que de doubles barres ||.Les doubles barres retournent une seule valeur, alors qu'elles devraient renvoyer un vecteur de valeurs pour chaque itération de la boucle (puisque votre boucle remplit une colonne entière avec chaque boucle) - J'ai modifié le code ci-dessus avec des barres simples pour refléter cela. – Canovice
aussi, il semble que la fonction playercols fonctionne mieux pour une raison quelconque lorsque j'ajoute return (mydf) entre les deux accolades de fermeture. – Canovice