• Source Code
  1. Operaciones
  2. Modificación de columnas
  • Introducción
    • Introducción y recursos
    • Sintaxis básica
    • Importar y exportar datos
  • Operaciones
    • Filtros y selección de columnas
    • Modificación de columnas
    • Agrupación y cadenas de operaciones
    • Uniones entre tablas
    • Reformatear tablas
    • .SD()
    • Ejercicios

On this page

  • Operaciones en j
  • Agregar nuevas columnas a nuestro data.table

Modificación de columnas

Operaciones en j

data.table nos permite efectuar operaciones sobre las columnas, por ejemplo, contar cuántas coincidencias tenemos para nuestros criterios aplicados.

data[country == "MX" & acousticness > 0.5, length(spotify_id)]
[1] 2395
data[country == "MX" & acousticness > 0.5, .N]
[1] 2395

Existen símbolos especiales como .N que nos cuenta el número de observaciones que cumplen nuestros criterios para el número de grupos que hemos definido. En este caso todas las observaciones pertenecen al mismo grupo.

Ejercicio

Pregunta: ¿Cuántas canciones que se hayan publicado de antes del 2000 han estado dentro del top 50? (Utiliza .N)

Respuesta
[1] 6430

Por ejemplo si quisieramos saber el promedio de duración en minutos de las canciones

data[, duration_ms/1000/60] %>% mean()
[1] 3.207851
data[,mean(duration_ms/1000/60)]
[1] 3.207851

Además podemos combinar filtros sobre las filas y acciones sobre las columnas. Por ejemplo, si queremos calcular el promedio de popularidad de las canciones en el top 50 de México. Primero hacemos un filtro de las canciones populares en México y después obtenemos el promedio de popularidad únicamente de estas filas.

Nota: La popularidad de una canción es un valor entre 0 y 100, donde 100 indica la mayor popularidad. La popularidad se calcula mediante un algoritmo y se basa, en su mayoría, en el número total de reproducciones que ha tenido la canción y en cuán recientes han sido esas reproducciones. En términos generales, las canciones que se reproducen mucho actualmente tendrán una popularidad mayor que las canciones que se reprodujeron mucho en el pasado. Las canciones duplicadas (por ejemplo, la misma canción de un sencillo y de un álbum) se califican de manera independiente. La popularidad de los artistas y los álbumes se deriva matemáticamente de la popularidad de las canciones. Nota: el valor de popularidad puede no reflejar la popularidad real en algunos días, ya que no se actualiza en tiempo real.

data[country == "MX", mean(popularity)]
[1] 84.38275

Debido a que tanto el filtro como la función sobre la columna están en el mismo comando, data.table sabe el total de las operaciones y puede hacer más eficiente la velocidad y el uso de la memoria cuando las ejecuta.

Ejercicio

Calcula el promedio y desviación estandar en los movimientos diarios de ranking (el cambio en las clasificaciones en comparación con el día anterior) en las canciones populares de México.

Respuesta
[1] 0.4105561 4.9231557

Agregar nuevas columnas a nuestro data.table

Hasta ahora estabamos aplicando funciones y obtuvimos vectores o números como resultado pero podemos utilizar el espacio j para crear nuevas columnas en nuestras tablas. Por ejemplo, podemos guardar la duración de cada canción en minutos.

 data[, .(duration_min = duration_ms/1000/60)]
         duration_min
                <num>
      1:     4.194450
      2:     3.506217
      3:     2.621317
      4:     2.924317
      5:     2.848117
     ---             
1179449:     5.174833
1179450:     2.887550
1179451:     3.079850
1179452:     2.992667
1179453:     2.205983

Ahora qué sucede si queremos generar la nueva columna dentro de nuestra tabla original. Por ejemplo si estimamos la diferencia en tiempo desde que el album fue publicado y la fecha en la que apareció entre el top 50

Nota: El operador := sirve para modificar tablas guardadas en la memoria directamente (modify in place)

data[, date_dif := snapshot_date - album_release_date]

data
Index: <country>
                     spotify_id                              name                     artists daily_rank daily_movement
                         <char>                            <char>                      <char>      <int>          <int>
      1: 2plbrEY59IikOBgBGLjaoe                  Die With A Smile       Lady Gaga, Bruno Mars          1              0
      2: 6dOtVTDdiauQNBQEDOtlAB                BIRDS OF A FEATHER               Billie Eilish          2              0
      3: 5G2f63n7IPVPPjfNIGih7Q                             Taste           Sabrina Carpenter          3              0
      4: 2HRqTpkrJO5ggZyyK6NPWz                          Espresso           Sabrina Carpenter          4             46
      5: 7tI8dRuH2Yc6RuoTjxo4dU                               Who                       Jimin          5              0
     ---                                                                                                               
1179449: 0AYt6NMyyLd0rLuvr0UkMH         Slime You Out (feat. SZA)                  Drake, SZA         46              4
1179450: 2Gk6fi0dqt91NKvlzGsmm7 SAY MY GRACE (feat. Travis Scott)        Offset, Travis Scott         47              3
1179451: 26b3oVLrRUaaybJulow9kz                            People                    Libianca         48              2
1179452: 5ydjxBSUIDn26MFzU3asP4                        Rainy Days                           V         49              1
1179453: 59NraMJsLaMCVtwXTSia8i                             Prada cassö, RAYE, D-Block Europe         50              0
         weekly_movement country snapshot_date popularity is_explicit duration_ms           album_name
                   <int>  <char>        <IDat>      <int>      <lgcl>       <int>               <char>
      1:               0            2024-09-08         97       FALSE      251667     Die With A Smile
      2:               0            2024-09-08        100       FALSE      210373 HIT ME HARD AND SOFT
      3:               0            2024-09-08         94       FALSE      157279       Short n' Sweet
      4:              46            2024-09-08         83        TRUE      175459       Short n' Sweet
      5:               0            2024-09-08         94       FALSE      170887                 MUSE
     ---                                                                                              
1179449:               0      AE    2023-10-18         84        TRUE      310490     For All The Dogs
1179450:               0      AE    2023-10-18         80        TRUE      173253           SET IT OFF
1179451:               0      AE    2023-10-18         88       FALSE      184791               People
1179452:               0      AE    2023-10-18         88       FALSE      179560              Layover
1179453:               0      AE    2023-10-18         94        TRUE      132359                Prada
         album_release_date danceability energy   key loudness  mode speechiness acousticness instrumentalness liveness
                     <IDat>        <num>  <num> <int>    <num> <int>       <num>        <num>            <num>    <num>
      1:         2024-08-16        0.521  0.592     6   -7.777     0      0.0304      0.30800         0.00e+00    0.122
      2:         2024-05-17        0.747  0.507     2  -10.171     1      0.0358      0.20000         6.08e-02    0.117
      3:         2024-08-23        0.674  0.907     3   -4.086     1      0.0640      0.10100         0.00e+00    0.297
      4:         2024-08-23        0.699  0.776     0   -5.282     1      0.0293      0.13100         5.36e-06    0.205
      5:         2024-07-19        0.660  0.756     0   -3.743     0      0.0320      0.00289         0.00e+00    0.193
     ---                                                                                                               
1179449:         2023-10-06        0.483  0.408     5   -9.243     0      0.0502      0.50800         0.00e+00    0.259
1179450:         2023-10-13        0.773  0.635    10   -5.060     1      0.0452      0.05850         0.00e+00    0.132
1179451:         2022-12-06        0.573  0.422    10   -7.621     0      0.0678      0.55100         1.31e-05    0.102
1179452:         2023-08-11        0.633  0.454     9   -8.016     0      0.0875      0.73900         0.00e+00    0.148
1179453:         2023-08-11        0.638  0.717     8   -5.804     1      0.0375      0.00100         1.79e-06    0.113
         valence   tempo time_signature date_dif
           <num>   <num>          <int>    <int>
      1:   0.535 157.969              3       23
      2:   0.438 104.978              4      114
      3:   0.721 112.964              4       16
      4:   0.708 103.963              4       16
      5:   0.838 116.034              4       51
     ---                                        
1179449:   0.105  88.880              3       12
1179450:   0.476 121.879              4        5
1179451:   0.693 124.357              5      316
1179452:   0.282  74.828              4       68
1179453:   0.422 141.904              4       68

Para agregar múltiples columnas en la tabla original se utiliza la siguientes sintaxis

dt[,`:=`(col1 = funcion, col2 = funcion)]

dt[, c("col1","col2","col3") := list(val1,val2,val3)]
Ejercicio
  1. Agrega una nueva columna (year_release) a la tabla original que solo muestre el año de publicación del album de la canción

  2. En un solo comando: genera una columna de diferencia entre la fecha de publicación y la fecha en la que la canción apareció en el top50. Además generar una columna de duración de la canción en minutos

Respuesta

Ejercicio 1

 [1] "spotify_id"         "name"               "artists"            "daily_rank"         "daily_movement"    
 [6] "weekly_movement"    "country"            "snapshot_date"      "popularity"         "is_explicit"       
[11] "duration_ms"        "album_name"         "album_release_date" "danceability"       "energy"            
[16] "key"                "loudness"           "mode"               "speechiness"        "acousticness"      
[21] "instrumentalness"   "liveness"           "valence"            "tempo"              "time_signature"    
[26] "date_dif"           "year_release"      
   year_release
         <char>
1:         2024
2:         2024
3:         2024
4:         2024
5:         2024
6:         2024

Ejercicio 2

 [1] "spotify_id"         "name"               "artists"            "daily_rank"         "daily_movement"    
 [6] "weekly_movement"    "country"            "snapshot_date"      "popularity"         "is_explicit"       
[11] "duration_ms"        "album_name"         "album_release_date" "danceability"       "energy"            
[16] "key"                "loudness"           "mode"               "speechiness"        "acousticness"      
[21] "instrumentalness"   "liveness"           "valence"            "tempo"              "time_signature"    
[26] "date_dif"           "year_release"       "days_until_top50"   "duration_min"      
         days_until_top50 duration_min
                    <int>        <num>
      1:               23     4.194450
      2:              114     3.506217
      3:               16     2.621317
      4:               16     2.924317
      5:               51     2.848117
     ---                              
1179449:               12     5.174833
1179450:                5     2.887550
1179451:              316     3.079850
1179452:               68     2.992667
1179453:               68     2.205983