Declaración if para el promedio ponderado en R

Tengo un archivo de datos que tiene varios millones de líneas y contiene información de muchos grupos. A continuación se muestra una sección abreviada:

MARKER      GROUP1_A1   GROUP1_A2   GROUP1_FREQ GROUP1_N    GROUP2_A1   GROUP2_A2   GROUP2_FREQ GROUP2_N
rs10    A   C   0.055   1232    A   C   0.055   3221
rs1000  A   G   0.208   1232    A   G   0.208   3221
rs10000 G   C   0.134   1232    C   G   0.8624  3221
rs10001 C   A   0.229   1232    A   C   0.775   3221

Me gustaría crear un promedio ponderado de la variable de frecuencia (FREQ) (que en sí mismo es sencillo), sin embargo, en este caso, algunas de las filas no coinciden (filas 3 y 4). Si las letras no se alinean, entonces la frecuencia del segundo grupo debe restarse 1 antes de calcular la media ponderada de ese marcador.

Me gustaría configurar una instrucción IF simple, pero no estoy seguro de la sintaxis de dicha tarea.

¡Cualquier idea o dirección es apreciada!

preguntado el 27 de julio de 12 a las 20:07

1 Respuestas

Digamos que ha leído sus datos en un marco de datos llamado mydata. Luego haz lo siguiente:

mydata$GROUP2_FREQ <- mydata$GROUP2_FREQ - (mydata$GROUP1_A1 != mydata$GROUP2_A1)

Funciona porque R trata los valores VERDADEROS como 1 y los valores FALSO como 0.

EDITAR: intente lo siguiente en su lugar:

mydata$GROUP2_FREQ <- abs( (as.character(mydata$GROUP1_A1) != 
                            as.character(mydata$GROUP2_A1)) -                   
                          as.numeric(mydata$GROUP2_FREQ) )

Respondido 27 Jul 12, 21:07

Respuesta editada; Entendí mal tu pregunta la primera vez que la leí. - Edward

Hola Edward, gracias, no estoy seguro de que esto sea exactamente lo que estoy buscando. Me ha dado un error: "Error en $<-.data.frame(*tmp*, "GROUP2_FREQ", valor = numérico (0)): el reemplazo tiene 0 filas, los datos tienen 5 ", por lo que no puedo estar seguro, pero la frecuencia debe restarse de 1, SOLO si A1 y A2 entre grupos no lo hacen partido. ¿Eso tiene sentido? - mfk534

Lo hace. Veo que quieres restar la frecuencia de 1, no al revés (que pensé por tu pregunta). Entonces, mi respuesta debe cambiarse para reflejar eso ... en cuanto a su error, ¿hay alguna forma de que pueda dar una pequeña muestra reproducible para verificar? - Edward

Encontré el problema: el data.frame guardó todo como factores. Intenta envolver mi solución en as.numeric (Voy a publicar una actualización de mi solución ahora) - Edward

No hay problema. Solo una cosa con el abs - mi solución solo funcionará bajo el supuesto de que las frecuencias están entre 0 y 1. Si alguna vez tiene que lidiar con un rango más grande, tendrá que hacer la verificación de una manera más elegante que la que tengo aquí - Edward

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.