Llenar dataframe en R en funcion de valores de la columna principal y de la fila principal

publicado por: Anonymous

perdón por el título pero es dificil de explicar, creo que con un ejemplo es mejor.

Supongamos que tengo un dataframe u otro que me muestra la información de cantidad de dinero en distintas monedas para cada persona, una tabla como la que muestro a continuación:

original

Ejemplo:

 df <- data.frame(NOMBRE=c('JUAN','JUAN', 'PEDRO', 'PEDRO', 'PEDRO', 'LUIS', 'LUIS'),
                  MONEDA=c('EUR', 'USD', 'EUR', 'CLP', 'USD', 'GBP', 'EUR'),
                  MONTO=c(10, 20, 30, 10, 20, 30, 10))

El problema es que necesito hacer una matriz consolidada con las monedas como columna y donde me busque la información para cada persona distinta en función del primer dataframe. El aspecto de este dataframe sería el siguiente:

DAtaframe

Lo que necesito es una funcion o algo en R que me permita llenar la información de lo que se muestra en amarillo

Soy un poco novato en R y no he encontrado una preguntar similar.

Muchas gracias

solución

Si no tienes problemas en incorporar funcionalidad extra, te recomiendo que uses los paquetes dplyr y tdyr, a menos que busques dominar la funcionalidad base de R, estos paquetes son muy útiles para el que está comenzando por que ofrecen una semántica más sencilla y clara para resolver muchos requerimientos en cuanto a manipulación de datos:

library(dplyr)
library(tidyr)

df %>% 
  group_by(NOMBRE) %>% 
  spread(MONEDA, MONTO)

# A tibble: 3 x 5
# Groups:   NOMBRE [3]
  NOMBRE   CLP   EUR   GBP   USD
  <fct>  <dbl> <dbl> <dbl> <dbl>
1 JUAN      NA    10    NA    20
2 LUIS      NA    10    30    NA
3 PEDRO     10    30    NA    20

Detalle:

  • Por empezar usamos el operador “infix” %>% o pipe/pipa, el cual permite “concatenar” la salida de una función con la entrada de la otra, lo cual hace más legible el código.
  • Con group_by agrupamos los datos por NOMBRE
  • Con spread “desplegamos” MONEDA y sus respectivos MONTO a lo ancho
  • La salida es un objeto tibble que para el caso no mucho más distinto que un data.frame básico de R
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *