Foro de debate

Como crear un ciclo for para datos pareados

 
Imagen de Daniela Estay
Como crear un ciclo for para datos pareados
de Daniela Estay - lunes, 31 de diciembre de 2018, 18:20
 

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!

Imagen de Manuel Muñoz Márquez
Re: Como crear un ciclo for para datos pareados
de Manuel Muñoz Márquez - martes, 1 de enero de 2019, 11:56
 

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.

Imagen de Daniela Estay
Re: Como crear un ciclo for para datos pareados
de Daniela Estay - martes, 1 de enero de 2019, 21:16
 

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?

Imagen de Manuel Muñoz Márquez
Re: Como crear un ciclo for para datos pareados
de Manuel Muñoz Márquez - miércoles, 2 de enero de 2019, 13:24
 

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.

Imagen de Daniela Estay
Re: Como crear un ciclo for para datos pareados
de Daniela Estay - miércoles, 2 de enero de 2019, 13:44
 

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


Imagen de Manuel Muñoz Márquez
Re: Como crear un ciclo for para datos pareados
de Manuel Muñoz Márquez - miércoles, 2 de enero de 2019, 18:56
 

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

Imagen de Daniela Estay
Re: Como crear un ciclo for para datos pareados
de Daniela Estay - miércoles, 2 de enero de 2019, 19:27
 

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)

Imagen de Manuel Muñoz Márquez
Re: Como crear un ciclo for para datos pareados
de Manuel Muñoz Márquez - miércoles, 2 de enero de 2019, 20:40
 
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.
Imagen de Daniela Estay
Re: Como crear un ciclo for para datos pareados
de Daniela Estay - miércoles, 2 de enero de 2019, 21:27
 

Estimado, muchísimas gracias, una consulta, me podrías por favor dejarme tu correo para comunicarme por interno???

Imagen de Daniela Estay
Re: Como crear un ciclo for para datos pareados
de Daniela Estay - miércoles, 9 de enero de 2019, 21:16
 

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

Imagen de Manuel Muñoz Márquez
Re: Como crear un ciclo for para datos pareados
de Manuel Muñoz Márquez - jueves, 10 de enero de 2019, 07:32
 

Buenas Daniela:

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

Un saludo.

Imagen de Daniela Estay
Re: Como crear un ciclo for para datos pareados
de Daniela Estay - jueves, 10 de enero de 2019, 14:48
 

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.


Imagen de Manuel Muñoz Márquez
Re: Como crear un ciclo for para datos pareados
de Manuel Muñoz Márquez - viernes, 11 de enero de 2019, 07:44
 

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.

Imagen de Daniela Estay
Re: Como crear un ciclo for para datos pareados
de Daniela Estay - viernes, 11 de enero de 2019, 13:37
 

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

Imagen de Manuel Muñoz Márquez
Re: Como crear un ciclo for para datos pareados
de Manuel Muñoz Márquez - sábado, 12 de enero de 2019, 10:05
 

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.

Imagen de Daniela Estay
Re: Como crear un ciclo for para datos pareados
de Daniela Estay - domingo, 20 de enero de 2019, 13:37
 

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,]


Imagen de Manuel Muñoz Márquez
Re: Como crear un ciclo for para datos pareados
de Manuel Muñoz Márquez - domingo, 20 de enero de 2019, 15:42
 
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.
Imagen de Daniela Estay
Re: Como crear un ciclo for para datos pareados
de Daniela Estay - domingo, 20 de enero de 2019, 23:31
 

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 ==?

Imagen de Manuel Muñoz Márquez
Re: Como crear un ciclo for para datos pareados
de Manuel Muñoz Márquez - lunes, 21 de enero de 2019, 07:49
 

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

Imagen de Daniela Estay
Re: Como crear un ciclo for para datos pareados
de Daniela Estay - lunes, 21 de enero de 2019, 17:03
 

Muchas gracias por su ayuda profesor, quedé clarita!