titles plots mtext change r indexing enumerate

plots - Zip o enumerar en R?



text in r (4)

Ha habido algunas discusiones sobre la comprensión de la lista para R, por ejemplo, here o there . El paquete hash incluso ofrece una estructura tipo diccionario. Sin embargo, como otros dijeron, es difícil tratar de asignar las instalaciones de un idioma a otro (incluso si esto es lo que realmente ofrece la comparación de los lenguajes de programación ) sin una comprensión clara de a qué se supone que debe estar acostumbrado. Por ejemplo, puedo imitar Python zip() en R de la siguiente manera:

Pitón

In [1]: x = [1,2,3] In [2]: y = [4,5,6] In [3]: zip(x, y) Out[3]: [(1, 4), (2, 5), (3, 6)]

R

> x <- 1:3 > y <- 4:6 > list(x, y) # gives a simple list > as.list(paste(x, y)) # three tuples, as a list of characters > mapply(list, x, y, SIMPLIFY=F) # gives a list of 3 tuples > rbind(x, y) # gives a 2x3 matrix

Como se puede ver, esto realmente depende de lo que quieras hacer con el resultado después.

¿Cuáles son los equivalentes R para estas listas de comprensión de 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

Ejemplo con salida

>>> [(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)]

He resuelto este problema anteriormente con un truco en R pero ya no recuerdo, la primera idea fue itertools -pkg, pero espero encontrar una manera más idiomática de hacer las cosas.


Respuesta para enumerate python:

En R, se ordena una lista (ver esta respuesta ). Por lo tanto, todo lo que necesita es indexar cualquiera de las teclas (usando names()[i] ) o valores (usando [[i]] ).

Usar seq_along (alternativamente puede hacer for(i in 1:length(mylist)){...} ):

> mylist <- list(''a''=10,''b''=20,''c''=30) > for (i in seq_along(mylist)){ + print(paste(i,names(mylist)[i],mylist[[i]])) + } [1] "1 a 10" [1] "2 b 20" [1] "3 c 30"

Respuesta para python zip :

Vea una de las respuestas anteriores para imitar la lista de tuplas. Mi preferencia es hacia un marco de datos como se muestra en la respuesta de BondedDust:

> x <- 1:3 > y <- 4:6 > data.frame(x=x, y=y) x y 1 1 4 2 2 5 3 3 6


Si esa es la representación de impresión de Python de una matriz, entonces este código:

j <- 10:20 matrix(c(seq_along(j), j), ncol=2) #------------ [,1] [,2] [1,] 1 10 [2,] 2 11 [3,] 3 12 [4,] 4 13 [5,] 5 14 [6,] 6 15 [7,] 7 16 [8,] 8 17 [9,] 9 18 [10,] 10 19 [11,] 11 20

Todavía estamos dejando a aquellos de nosotros que no somos usuarios de Python en la oscuridad con respecto a la estructura de su salida deseada. Utiliza el término "lista" pero el resultado sugiere un conjunto ordenado de tuplas.

Dada la orientación de @ chi, también podríamos sugerir el uso de la estructura de "dataframe" muy centrada en R

x <- 1:3 y <- 4:6 dfrm <- data.frame(x=x, y=y)

... que tiene la flexibilidad de una lista en términos de tipos de columnas y las características de acceso de una matriz en términos de indexación de filas y columnas. O uno podría usar la solicitud de hhh y crear los valores indexados implícitamente del vector j, 10:20 , usando el vector de rownames que comienza en "1" por defecto, pero que podría ser alterado para convertirse en un vector de caracteres comenzando en "0"

dfrm <- data.frame(j=10:20) dfrm[3, ] #[1] 12 rownames(dfrm) <- 0:10 dfrm["0",] # [1] 10

Desafortunadamente, el incauto encontrará que dfrm [0,] no es una llamada feliz, devolviendo el vector de longitud 0.


# similar to python. return a list of list. Short sequences get recycled. zip <- function(...){ all.list <- list(...) ele.names <- names(all.list) max.length <- max(sapply(all.list, length)) lapply(0:(max.length - 1), function(i) { res <- lapply(all.list, function(l) l[i %% length(l) + 1]) names(res) <- ele.names res }) }