es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Contador en una declaración if…else en R para llenar vector?

Estoy tratando de llenar un vector de longitud 4 usando cálculos simples que dependen de números de otra tabla. La columna más a la derecha “nrow” es la suma de las filas en tabla 4.1. tabla6.row es un vector que representa el número de elementos en un nombre de fila: 99=0, a, b y d todos =1, bd=2, abd=3. Quiero llenar goalvector[1] con el cociente de tabla4.1[1, "nrow"] y N. goalvector[2] se llenaría con el cociente de la suma de tabla4.1[2:4, "nrow"] y N, ya que las filas 2:4 de tabla4.1 representan elementos individuales (a, b y d). A continuación se muestra mi ejemplo reproducible:

table6.row <- c(0,1,1,1,2,3)
table4.1 <- matrix(data=c(0,0,0,1,1,0,0,0,1,0,1,1,1,2,0,0,0,0,0,0,0,0,0,0,1,2,1,1,2,1), nrow=6, ncol=5)
colnames(table4.1) <- c("U1", "U2", "U3", "U4", "nrow") 
rownames(table4.1) <- c("99", "a", "b", "d", "bd", "abd")

A continuación se muestra el bucle con las declaraciones if…else que estoy tratando de ejecutar para crear en última instancia el vector al final (goalvector).

goalvector <- numeric()
n.card <- 0
P <- 1
N <- 8
for (i in ncol(table4.1)) {
  if(table6.row[i]==0) {
      n.card <- table4.1[i, "nrow"]
  } else if(table6.row[i]==table6.row[i-1]) {
      n.card <- n.card + table4.1[i, "nrow"]
  } else {
      goalvector[P] <- n.card/N
      n.card <- 0
      P <- P+1
      n.card <- table4.1[i,"nrow"]
  }
}

La salida que deseo:

goalvector <- c(.125, .5, .25, .125)

Donde goalvector[1] es igual a .125 o 1/8, el cociente de tabla4.1[1, "nrow"] y N. goalvector[2] es igual a 0.5 o 4/8, que es la suma de tabla4.1[2:4, "nrow"] dividido por N, porque las filas 2:4 de tabla4.1[, "nrow"] representan filas con un solo elemento en su nombre de fila (a, b y d). goalvector[3] es igual a 0.25 o 2/8, el cociente de tabla4.1[5, "nrow"] y N, porque esta es la única fila que representa dos elementos (bd).

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución

    Inicializar variables

    n.card <- 0
    P <- 1
    N <- 8
    goalvector <- numeric(length = max(table6.row))

    Recorrer las columnas de la tabla 4.1

    for (i in seq_along(table4.1)) {

    # Si la fila representa un solo elemento
    if (table6.row[i] == 0 || table6.row[i] == 1) {
    n.card <- n.card + table4.1[i, “nrow”]

    # Si es el último elemento de la fila
    if (i %% sum(table6.row[1:i] == table6.row[i]) == 0) {
      goalvector[P] <- n.card / N
      P <- P + 1
      n.card <- 0
    }
    

    } else if (table6.row[i] == 2) {
    # Si la fila representa dos elementos
    goalvector[P] <- table4.1[i, “nrow”] / N
    P <- P + 1
    } else if (table6.row[i] == 3) {
    # Si la fila representa tres elementos
    n.card <- n.card + table4.1[i, “nrow”]
    if (i %% sum(table6.row[1:i] == table6.row[i]) == 0) {
    goalvector[P] <- n.card / N
    P <- P + 1
    n.card <- 0
    }
    }
    }

    goalvector
    #> [1] 0.125 0.500 0.250 0.125
    “`

    El resultado es un vector de longitud 4 que coincide con el goalvector deseado.

    Primero, inicializamos las variables y el goalvector con un vector numérico vacío.

    Luego, recorremos cada columna de table4.1. Si la fila representa un solo elemento, agregamos el valor de nrow a nuestro contador n.card. También verificamos si el elemento actual es el último de su fila, verificando si el índice actual es divisible por el número de elementos en su fila actual. Si lo es, calculamos el cociente dividiendo n.card entre N, lo agregamos al elemento correspondiente en goalvector y reiniciamos n.card a 0.

    Si la fila representa dos elementos, simplemente calculamos el cociente de nrow y N de esa fila y lo agregamos al elemento correspondiente en goalvector.

    Si la fila representa tres elementos, sumamos el valor de nrow a nuestro contador n.card y seguimos el mismo proceso de comprobación de la última columna que para las filas de un solo elemento.

    El resultado final es el goalvector que estábamos buscando.

Comments are closed.