Je ne connais pas les termes techniques appropriés pour ce type d'opération, il a donc été difficile de rechercher des solutions existantes. J'ai pensé que j'essaierais d'afficher ma propre question et j'espère que quelqu'un pourra m'aider (ou me diriger dans la bonne direction). J'ai un vecteur de caractères et je veux les rassembler en groupes de deux et trois. Pour illustrer, voici une version simplifiée:Concaténation de groupes d'éléments de caractères vectoriels
Le tableau que j'ai:
"a" "b" "c" "d" "e" "f"
Je veux courir à travers le vecteur et les groupes de concaténer deux et trois éléments. Ceci est le résultat final que je veux:
"a b" "b c" "c d" "d e" "e f"
Et
"a b c" "b c d" "c d e" "d e f"
Je résolu ainsi possible le plus simple et le plus sale en utilisant pour-boucles, mais il prend beaucoup de temps à courir et je suis convaincu cela peut être fait plus efficacement.
Voici mon ghetto-bidouille:
t1 <- c("a", "b", "c", "d", "e", "f")
t2 <- rep("", length(t1)-1)
for (i in 1:length(t1)-1) {
t2[i] = paste(t1[i], t1[i+1])
}
t3 <- rep("", length(t1)-2)
for (i in 1:length(t1)-2) {
t3[i] = paste(t1[i], t1[i+1], t1[i+2])
}
que je recherchais dans sapply et tapply etc., mais je ne peux pas sembler comprendre comment utiliser « l'élément suivant » dans le vecteur.
Toute aide sera récompensée par ma gratitude éternelle!
-------------- -------------- Modifier
temps d'exécution des suggestions à l'aide de données d'entrée avec 3 ~ millions de lignes:
START: [1] "2016-11-20 19:24:50 CET" For-loop: [1] "2016-11-20 19:28:26 CET" rollapply: [1] "2016-11-20 19:38:55 CET" apply(matrix): [1] "2016-11-20 19:42:15 CET" paste t1[-length...]: [1] "2016-11-20 19:42:37 CET" grep: [1] "2016-11-20 19:44:30 CET"
Merci! J'ai testé les trois solutions. Mon vecteur d'entrée a environ 3 millions d'éléments et ma boucle for-passée a duré environ 4 minutes. Votre première solution a été incroyablement efficace, en utilisant seulement 20 secondes. Le deuxième meilleur était la solution grep. La solution d'application (matrice) a passé autant de temps que la boucle for. J'utilise ta première version. – CoveredInChocolate
@CoveredInChocolate Le troisième a été ralenti car 'apply' est fondamentalement similaire à une boucle' for'. Vous pouvez convertir en 'data.frame' et utiliser' do.call (paste, as.data.frame (matrix (t1, .... ' – akrun
) Eh bien, on dirait que je te dois des excuses: quand j'ai fait mes tests, je n'ai pas utilisé n1 <- 2 donc la comparaison était injuste Après avoir corrigé cela, l'application (la version matricielle a passé 3 minutes (1 minute de moins qu'une boucle for) et après avoir été convertie en data.frame, elle n'a duré qu'une minute, c'est une amélioration significative, génial! :) – CoveredInChocolate