Después de un poco de depuración de hoy, para mi desgracia me encontré con que:

for (i in 1:0) {
     print(i)
}

Que realmente se imprime 1 y 0, respectivamente, en R. El problema surgió cuando la escritura

for (i in 1:nrow(myframe) {
     fn(i)
}

Que tenía la intención de no ejecutar a todos si nrow(myframe)==0. Es la corrección correspondiente:

if (nrow(myvect) != 0) {
    for (i in 1:nrow(myframe) {
        fn(i)
    }
}

O hay una más adecuada manera de hacer lo que yo quería en R?

OriginalEl autor mt88 | 2014-07-23

5 Comentarios

  1. 14

    Puede utilizar seq_along lugar:

    vec <- numeric() 
    length(vec)
    #[1] 0
    
    for(i in seq_along(vec)) print(i)   # doesn't print anything
    
    vec <- 1:5
    
    for(i in seq_along(vec)) print(i)
    #[1] 1
    #[1] 2
    #[1] 3
    #[1] 4
    #[1] 5

    Editar después de OP actualización

    df <- data.frame(a = numeric(), b = numeric())
    > df
    #[1] a b
    #<0 rows> (or row.names with length 0)
    
    for(i in seq_len(nrow(df))) print(i)    # doesn't print anything
    
    df <- data.frame(a = 1:3, b = 5:7)
    
    for(i in seq_len(nrow(df))) print(i)
    #[1] 1
    #[1] 2
    #[1] 3
    Accidentalmente tengo mis preguntas un poco mal. Ver ediciones. Es su equivalente, cuando se trata de hacerlo lo largo de la longitud de un dataframe?
    ver mi respuesta actualizada

    OriginalEl autor docendo discimus

  2. 2

    Con respecto a la edición, ver la contraparte de la función seq_len(NROW(myframe)). Este uso es exactamente la razón por la que no uso 1:N en un for() bucle, en caso que cualquier valor que termina sustituyendo N es 0 o negativo.

    Una alternativa (que sólo se esconde el bucle) es hacer apply(myframe, 1, FUN = foo) donde foo es una función que contiene las cosas que usted quiere hacer para cada fila de myframe y, probablemente, solo cortar y pegar en el cuerpo del bucle.

    OriginalEl autor Gavin Simpson

  3. 2

    Para los vectores hay seq_along, para DataFrames puede utilizar seq_len

    for(i in seq_len(nrow(the.table)){
        do.stuff()
    }

    OriginalEl autor Boris Gorelik

  4. 1

    Creo que la manera más apropiada en R es el uso de un apply función. Más a menudo que no, hay un apply función que hace que. Y más a menudo que no, usted no necesita una secuencia.

    Aquí un ejemplo en el que se aplica diff a cada columna, cada fila.

    > d <- data.frame(x = 1:5, y = 6:10)

    sobre las columnas,

    > lapply(d, diff)
    $x
    [1] 1 1 1 1
    
    $y
    [1] 1 1 1 1

    a través de las filas,

    > apply(d, 1, diff)
    [1] 5 5 5 5 5

    sobre las columnas de nuevo, devolviendo una matriz de

    > sapply(d, diff)
         x y
    [1,] 1 1
    [2,] 1 1
    [3,] 1 1
    [4,] 1 1

    Ver en este enlace para una más que excelente explicación acerca de apply

    OriginalEl autor Rich Scriven

  5. 1

    Claramente todas las respuestas anteriores de hacer el trabajo.

    Me gusta tener algo como esto:

    rows_along <- function(df) seq(nrow(df))

    y, a continuación,

    for(i in rows_along(df)) # do stuff

    Totalmente idiosincrásicos respuesta, es simplemente un contenedor.
    Pero creo que es más legible/intuitiva.

    OriginalEl autor Abel Borges

Dejar respuesta

Please enter your comment!
Please enter your name here