Foro de debate

Como crear un ciclo for para datos pareados

Como crear un ciclo for para datos pareados

de Daniela Estay -
Número de respuestas: 19

Estimados, su ayuda porfavor, necesito crear una sentencia for para un i, j, el codigo que tengo es el siguiente pero se me cae:

a=c(13,14)

b=c(528,20)

for(i in a)

{for (i in b)

C_i=datos[datos$Codigo_Producto==i,]

set.seed(100)

indx_j=sample(nrow(C_i),size=j)

M_j=C_i[indx_j,]

print(summary(M_j))}}

La idea es que el 13 del a me lo haga con el 14 del b y el 528 del a con el 20 del b.

En resumen lo que hago acá (con a) es filtrar por el código de producto que necesito, y luego la idea del b es para la obtención de muestra aleatoria del tamaño que indico.

¿Alguien me puede ayudar porfis??? Muchas gracias!

En respuesta a Daniela Estay

Re: Como crear un ciclo for para datos pareados

de Manuel Muñoz Márquez -

Buenas:

No entiendo muy bien lo que quieres hacer, pero te sugiero algunos cambios:

a=c(13,14)
b=c(528,20)
for(i in a){
C_i=datos$Codigo_Producto[datos$Codigo_Producto==i]
for (j in b) {
set.seed(100)
M_j=sample(C_i,size=j)
print(summary(M_j))
}
}

¿Cuál es el objetivo de fijar la semilla con set.seed? Haciendolo de ese forma siempre vas a obtener la misma muestra.

Un saludo.

En respuesta a Manuel Muñoz Márquez

Re: Como crear un ciclo for para datos pareados

de Daniela Estay -

Muchas gracias por tu pronta respuesta mira la idea es que me haga la combinacion de cada valor de acuerdo a su posicion, es decir 1ue el primer ciclo agarre a=13 y b=528, luego siga con los segundos es decir a=14 y b=20. No todas las combinaciones posibles entre ambos. Otra cosita. Sabes como poder guardar los valor de cada for?

En respuesta a Daniela Estay

Re: Como crear un ciclo for para datos pareados

de Manuel Muñoz Márquez -

Buenas:

Sigo sin entender muy bien lo que quieres, pero tal vez sea esto:

a=c(13,14)
b=c(528,20)
for(i in 1:2){
C_i=datos$Codigo_Producto[datos$Codigo_Producto==a[i]]
set.seed(100)
M_j=sample(C_i,size=b[i])
print(summary(M_j))
}

¿Cuál es el objetivo de fijar la semilla con set.seed? Haciéndolo de ese forma siempre vas a obtener la misma muestra.

Los datos en el bucle for se guardan como en cualquier lenguaje de programación.
¿Qué quieres guardar: los datos o el resumen?

¿Cómo los quieres guardar: como una lista, como una matriz,...?

Un saludo.

En respuesta a Manuel Muñoz Márquez

Re: Como crear un ciclo for para datos pareados

de Daniela Estay -

No, no funciona, mira la idea del for es que me haga estas combinaciones para los dos pares de datos que estoy colocando:

#Para a=13 y b=528:

C_13=datos[datos$Codigo_Producto=="13",]

set.seed(100)

indx=sample(nrow(C_13),size=528)

M_13=C_13[indx,]

summary(M_13)

#Para a=14 y b=20:

C_14=datos[datos$Codigo_Producto=="14",]

set.seed(100)

indx=sample(nrow(C_14),size=20)

M_14=C_14[indx,]

summary(M_14)

Y luego que me guarde la variable, por ejemplo cuando haga M_13 o M_14 me la encuentre.

Saludos


En respuesta a Daniela Estay

Re: Como crear un ciclo for para datos pareados

de Manuel Muñoz Márquez -

Hola Daniela:

En M_13 y M_14 estás guardando un data.frame.

Es más fácil ayudar si proporcionas un código que sea reproducible.

El siguiente código, que puedes reproducir, hace lo que quieres

datos <- data.frame(Codigo_Producto = sample(c(13,14), size = 10000, replace=TRUE), Precio = sample(10, size=10000, replace=TRUE))
a=c(13,14)
b=c(528,20)
for(i in 1:2){
   C_i=datos[datos$Codigo_Producto == a[i],]
   set.seed(100)
   indx = sample(nrow(C_i), size = b[i])
   assign(paste0('M_', a[i]), C_i[indx,])
   print(summary(get(paste0('M_', a[i]))))
}
head(M_13)
head(M_14)

Un saludo

En respuesta a Manuel Muñoz Márquez

Re: Como crear un ciclo for para datos pareados

de Daniela Estay -

Muchas gracias, ya pude dar con el código gracias a tu ayuda y es el siguiente:

a=c(13,14,36,38,40,41,45,46,47,48,51,53,54,55,95,99,199,213,214,215,248,262,267,270,289,290,291,292,293,294,297,310,326,

327,330,332,336,360,361,362,402,404,500,600,650,700,800,801)

b=c(2939,183,824,213,179,351,2051,463,234,133,10,16,16,3,3,8,0,5,2540,89,357,4,898,635,354,910,1105,218,728,

905,58,115,49,18,121,8,819,604,75,18,2378,768,419,2925,2693,3137,1430,1858)

for(i in 1:47)

{C_i=datos[datos$Codigo_Producto==a[i],]

set.seed(100)

M_j=C_i[sample(nrow(C_i),size=b[i]),]

print(abs(((mean(C_i$Capital_Asegurado)/mean(M_j$Capital_Asegurado))-1)*100))}

Ahora necesito que al llamar por ejemplo a C_800 me encuentre el valor (actualmente me indica que no existe)

En respuesta a Daniela Estay

Re: Como crear un ciclo for para datos pareados

de Manuel Muñoz Márquez -
Hola: Detrás de la línea
M_j=C_i[sample(nrow(C_i),size=b[i]),]
añade

assign(paste0('M_', a[i]), M_j)
Un saludo.
En respuesta a Manuel Muñoz Márquez

Re: Como crear un ciclo for para datos pareados

de Daniela Estay -

Estimado, si quisiera guardar los resultados que me va arrojando cada for en una variable llamada a por ejemplo, como debería hacerlo??? Agrego el rbind en el comando pero no funciona,


Muchas gracias,


Saludos

En respuesta a Daniela Estay

Re: Como crear un ciclo for para datos pareados

de Manuel Muñoz Márquez -

Buenas Daniela:

¿Puede poner el código con el que está intentando hacerlo?

Un saludo.

En respuesta a Manuel Muñoz Márquez

Re: Como crear un ciclo for para datos pareados

de Daniela Estay -

Es este:

c=c(13,14,36,38,40,41,45,46,47,48,54,248,270,290,291,293,310,326,327,336,360,361,600,650,700,800,801)

d=c(28628,197,1186,228,197,410,3173,571,270,152,16,457,971,2314,2261,1404,115,50,18,2218,15143,

83,26507,13523,8074,3780,7168)

for(i in 1:27)

{Cced_i=datos[datos$Codigo_Producto==c[i],]

assign(paste0('Cced_', c[i]), Cced_i)

Mced_i=Cced_i[sample(nrow(Cced_i),size=d[i]),]

assign(paste0('Mced_', c[i]), Mced_i)

print((mean(Mced_i$Capital_Cedido)))}


La idea es que me quede una columna con todos los Cced y los Mced, no valores solos que va imprimiento en la consola a medida que va haciendo cada iteración del for.


En respuesta a Daniela Estay

Re: Como crear un ciclo for para datos pareados

de Manuel Muñoz Márquez -

Buenas:

Si no pone el código que no le funciona, no se le puede ayudar. En ese código no veo ningún rbind.

Si no da información suficiente de qué quiere hacer no es posible ayudarle.

Ponga un ejemplo con un conjunto de datos pequeños y muestre con ese conjunto de datos, qué quiere calcular.

Un saludo.

En respuesta a Manuel Muñoz Márquez

Re: Como crear un ciclo for para datos pareados

de Daniela Estay -

Es este:

a=c(13,14,36,38,40,41,45,46,47,48,51,53,54,55,95,99,213,214,215,248,262,267,270,289,290,291,292,293,

294,297,310,326,327,330,332,336,360,361,362,402,404,500,600,650,700,800,801)

b=c(2939,183,824,213,179,351,2051,463,234,133,10,16,16,3,3,8,5,2540,89,357,4,898,635,354,910,1105,218,728,905,58,115,

49,18,121,8,819,604,75,18,2378,768,419,2925,2693,3137,1430,1858)

for(i in 1:47)

{C_i=datos[datos$Codigo_Producto==a[i],]

assign(paste0('C_', a[i]), C_i)

M_i=C_i[sample(nrow(C_i),size=b[i]),]

assign(paste0('M_', a[i]), M_i)

cap_as=cbind(cap_as,M_i)}

Con el último lo que quiero hacer es ir agregando cada elemento que va haciendo del M_i, de manera que cuuando llame cap_as me salga la columna con los valores de cada for que hace paa M_i

En respuesta a Daniela Estay

Re: Como crear un ciclo for para datos pareados

de Manuel Muñoz Márquez -

Buenas:

Este código falla debido a que en la primera pasada del bucle, cap_as no está definido.

Prueba con esto

if (i==1) cap_as = M_i else cap_as=cbind(cap_as,M_i)

Un saludo.

En respuesta a Manuel Muñoz Márquez

Re: Como crear un ciclo for para datos pareados

de Daniela Estay -

Muchas gracias, funcionó, porfis, una ultima dudita. Arme un vector de pólizas que necesito  extraer de la base original (al cual llamo "polizas"), pero al querer extraer estos valores mediante el código "muestra_1=datos[datos$Poliza==polizas,]", R me arroja este error: Warning message:In datos$Poliza == polizas :  longitud de objeto mayor no es múltiplo de la longitud de uno menor. No se porque no me funciona, solo quiero extraer de la base datos las pólizas indicadas en el vector pólizas. Este es el codigo que estoy utilizando:

a=c(13,14,36,38,40,41,45,46,47,48,51,53,54,55,95,99,213,214,215,248,262,267,270,289,290,291,292,293,

294,297,310,326,327,330,332,336,360,361,362,402,404,500,600,650,700,800,801)

b=c(2643,116,318,69,121,118,981,172,74,133,10,4,11,2,1,2,1,1061,4,356,1,56,429,

102,528,482,79,728,709,29,114,25,9,53,8,590,600,60,13,520,56,159,2586,2459,2315,

1014,1437)

for(i in 1:47)

{A_i=POL[POL$Codigo_Producto==a[i],]

assign(paste0('A_', a[i]), A_i)

B_i=A_i[sample(nrow(A_i),size=b[i]),]

assign(paste0('B_', a[i]), B_i)

if (i==1)

muestra_cap_a=B_i

else

muestra_cap_a=rbind(muestra_cap_a,B_i)}

polizas=as.numeric(muestra_cap_a$Poliza)

muestra_1=datos[datos$Poliza==polizas,]


En respuesta a Daniela Estay

Re: Como crear un ciclo for para datos pareados

de Manuel Muñoz Márquez -
Buenas: No es un error es un aviso. Dado que datos$Poliza y polizas son dos vectores lo que se hace es comparar elemento a elemento. Creo que lo que quieres es coger los datos cuyo valor en datos$Poliza coincida con algún valor en polizas, en ese caso tu línea debería ser: muestra_1=datos[datos$Poliza %in% polizas,] Un saludo.
En respuesta a Manuel Muñoz Márquez

Re: Como crear un ciclo for para datos pareados

de Daniela Estay -

Muchas gracias profesor, con lo que usted me dijo funcionó perfecto. Un consulta, porque no sirve colocándole que extraiga los que sean igual al vector póliza como lo tenía, si finalmente lo que quería era tomar todos los que coincidían con ese valor. ¿Por que ahí no funciona el ==?

En respuesta a Daniela Estay

Re: Como crear un ciclo for para datos pareados

de Manuel Muñoz Márquez -

Buenas:

Cuando se comparan dos vectores la comparación se hace elemento a elemento. Como puedes comprobar en

> set.seed(0)
> x <- sample.int(2, 5, replace=TRUE)
> x
[1] 2 1 1 2 2
> y <- sample.int(2, 5, replace=TRUE)
> y
[1] 1 2 2 2 2
> x == y
[1] FALSE FALSE FALSE  TRUE  TRUE

Cuando un vector es de longitud inferior al otro se hace un reciclado, es decir, el más corto se repite tantas veces como sea necesario para compararlo con el grande, si la longitud del más corto no es un múltiplo de la del pequeño hace la comparación pero da el aviso pues esto no es lo habitual,

> z = c(1,2)
> z
[1] 1 2
> x == z
[1] FALSE FALSE  TRUE  TRUE FALSE
Warning message:
In x == z :
  longitud de objeto mayor no es múltiplo de la longitud de uno menor

Un saludo