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).
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”]
} 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 denrow
a nuestro contadorn.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 dividiendon.card
entreN
, lo agregamos al elemento correspondiente engoalvector
y reiniciamosn.card
a 0.Si la fila representa dos elementos, simplemente calculamos el cociente de
nrow
yN
de esa fila y lo agregamos al elemento correspondiente engoalvector
.Si la fila representa tres elementos, sumamos el valor de
nrow
a nuestro contadorn.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.