99 votes

Zip ou énumérer dans R ?

Quels sont les équivalents R pour ces compréhensions de liste Python :

 [(i,j) for i,j in zip(index, Values)]
[(i,j) for i,j in enumerate(Values)]
[(i,j) for i,j in enumerate(range(10,20))]   %MWE, indexing or enumerating to 
                                            %keep up with the index, there may 
                                            %be some parameter to look this up

Exemple avec sortie

 >>> [(i,j) for i,j in enumerate(range(10,20))]
[(0, 10), (1, 11), (2, 12), (3, 13), (4, 14), (5, 15), (6, 16), (7, 17), (8, 18), (9, 19)]

J'ai résolu ce problème plus tôt avec une astuce dans R mais je ne m'en souviens plus, la première idée était itertools -pkg mais j'espère trouver une façon plus idiomatique de faire les choses.

18voto

Neal Fultz Points 1908

zip et enumerate ne sont pas particulièrement difficiles à implémenter dans R :

 #' zip(1:5,1:10)
zip <- function(...) {
  mapply(list, ..., SIMPLIFY = FALSE)
}

Enumerate est simple à définir en termes de zip :

 #' enumerate(l=LETTERS)
enumerate <- function(...) {
  zip(ix=seq_along(..1), ...)
}

Étant donné que ce sont des fonctions appropriées, nous pouvons utiliser ... pour les rendre assez flexibles et concises, et tirer parti du comportement de mapply, comme le recyclage des entrées et le nommage correct de la sortie.

9voto

wphampton Points 424

Une autre option qui créera une liste de vecteurs consiste à utiliser la fonction Map comme vu ici par @peterhurford : https://rdrr.io/github/peterhurford/funtools/src/R/zippers.R

 > x <- 1:3
> y <- 4:6
> z <- 7:9
> Map(c, x, y, z)
 [[1]]
[1] 1 4 7

[[2]]
[1] 2 5 8

[[3]]
[1] 3 6 9

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X