En el vídeo anterior hemos visto los elementos esenciales de un bucle de tipo for, sin proporcionar ejemplos prácticos de su aplicación y de manera muy sencilla. Hemos llegado a utilizar índices para llegar recorrer y llegar los datos concretos de nuestros objetos. Ahora, vamos a profundizar en el uso de los índices en los bucles, utilizando un dataframe.

También vamos a ver un concepto importante, que es el tener que tener que preparar a priori los objetos donde almacenar resultados que buscamos obtener de nuestros resultados de los bucles.

Bucles sobre dataframes: operando con índices a través de las filas.

Vamos a cargar en primer lugar el archivo temp_carbon.csvque tiene las anomalías de temperatura y tierra y océano desde hace muchas décadas.La columna 1 nos indica el año del dato, la 3 el dato de anomalía de temperatura en tierra, y la 4 la oceánica. Hay algunos datos malos no disponibles antes de 1880 por lo que con un subset().

carbon<-read.csv("temp_carbon.csv",sep=";")
carbon<-subset(carbon,year>1879)
carbon
##     year temp_anomaly land_anomaly ocean_anomaly carbon_emissions
## 1   1880        -0.11        -0.48         -0.01              236
## 2   1881        -0.08        -0.40          0.01              243
## 3   1882        -0.10        -0.48          0.00              256
## 4   1883        -0.18        -0.66         -0.04              272
## 5   1884        -0.26        -0.69         -0.14              275
## 6   1885        -0.25        -0.56         -0.17              277
## 7   1886        -0.24        -0.51         -0.17              281
## 8   1887        -0.28        -0.47         -0.23              295
## 9   1888        -0.13        -0.41         -0.05              327
## 10  1889        -0.09        -0.31         -0.02              327
## 11  1890        -0.34        -0.51         -0.29              356
## 12  1891        -0.25        -0.52         -0.15              372
## 13  1892        -0.30        -0.49         -0.23              374
## 14  1893        -0.32        -0.54         -0.24              370
## 15  1894        -0.30        -0.38         -0.27              383
## 16  1895        -0.23        -0.39         -0.17              406
## 17  1896        -0.09        -0.33          0.00              419
## 18  1897        -0.09        -0.26         -0.03              440
## 19  1898        -0.26        -0.37         -0.22              465
## 20  1899        -0.15        -0.21         -0.13              507
## 21  1900        -0.07        -0.15         -0.05              534
## 22  1901        -0.15        -0.12         -0.16              552
## 23  1902        -0.25        -0.26         -0.24              566
## 24  1903        -0.37        -0.37         -0.37              617
## 25  1904        -0.45        -0.44         -0.46              624
## 26  1905        -0.27        -0.33         -0.25              663
## 27  1906        -0.21        -0.17         -0.22              707
## 28  1907        -0.38        -0.62         -0.29              784
## 29  1908        -0.43        -0.44         -0.43              750
## 30  1909        -0.44        -0.43         -0.45              785
## 31  1910        -0.40        -0.36         -0.42              819
## 32  1911        -0.44        -0.48         -0.43              836
## 33  1912        -0.34        -0.48         -0.28              879
## 34  1913        -0.32        -0.31         -0.32              943
## 35  1914        -0.14        -0.06         -0.17              850
## 36  1915        -0.09        -0.08         -0.10              838
## 37  1916        -0.32        -0.46         -0.26              901
## 38  1917        -0.40        -0.63         -0.29              955
## 39  1918        -0.30        -0.50         -0.21              936
## 40  1919        -0.25        -0.33         -0.21              806
## 41  1920        -0.23        -0.36         -0.18              932
## 42  1921        -0.16        -0.15         -0.17              803
## 43  1922        -0.25        -0.27         -0.24              845
## 44  1923        -0.25        -0.29         -0.24              970
## 45  1924        -0.24        -0.25         -0.24              963
## 46  1925        -0.18        -0.15         -0.19              975
## 47  1926        -0.07        -0.02         -0.10              983
## 48  1927        -0.17        -0.22         -0.16             1062
## 49  1928        -0.18        -0.15         -0.20             1065
## 50  1929        -0.33        -0.49         -0.27             1145
## 51  1930        -0.11        -0.13         -0.11             1053
## 52  1931        -0.06        -0.02         -0.08              940
## 53  1932        -0.13        -0.03         -0.17              847
## 54  1933        -0.26        -0.36         -0.22              893
## 55  1934        -0.11        -0.06         -0.13              973
## 56  1935        -0.16        -0.17         -0.15             1027
## 57  1936        -0.12        -0.12         -0.12             1130
## 58  1937        -0.01        -0.02         -0.01             1209
## 59  1938        -0.02         0.17         -0.10             1142
## 60  1939         0.01         0.10         -0.03             1192
## 61  1940         0.16         0.07          0.20             1299
## 62  1941         0.27         0.10          0.35             1334
## 63  1942         0.11         0.06          0.13             1342
## 64  1943         0.11         0.07          0.12             1391
## 65  1944         0.28         0.19          0.32             1383
## 66  1945         0.18        -0.07          0.30             1160
## 67  1946        -0.01        -0.01         -0.01             1238
## 68  1947        -0.04         0.04         -0.07             1392
## 69  1948        -0.05         0.05         -0.10             1469
## 70  1949        -0.07        -0.07         -0.08             1419
## 71  1950        -0.15        -0.32         -0.09             1630
## 72  1951         0.00        -0.06          0.02             1767
## 73  1952         0.05        -0.05          0.08             1795
## 74  1953         0.13         0.20          0.10             1841
## 75  1954        -0.10        -0.12         -0.09             1865
## 76  1955        -0.13        -0.11         -0.13             2042
## 77  1956        -0.18        -0.40         -0.10             2177
## 78  1957         0.07        -0.04          0.11             2270
## 79  1958         0.13         0.15          0.12             2330
## 80  1959         0.08         0.09          0.08             2454
## 81  1960         0.05         0.00          0.07             2569
## 82  1961         0.10         0.12          0.09             2580
## 83  1962         0.11         0.16          0.09             2686
## 84  1963         0.12         0.21          0.08             2833
## 85  1964        -0.14        -0.22         -0.11             2995
## 86  1965        -0.07        -0.12         -0.05             3130
## 87  1966        -0.01        -0.05          0.01             3288
## 88  1967         0.00         0.01         -0.01             3393
## 89  1968        -0.03        -0.11          0.01             3566
## 90  1969         0.11        -0.08          0.17             3780
## 91  1970         0.06         0.05          0.06             4053
## 92  1971        -0.07        -0.02         -0.09             4208
## 93  1972         0.04        -0.17          0.11             4376
## 94  1973         0.19         0.34          0.14             4614
## 95  1974        -0.06        -0.18         -0.02             4623
## 96  1975         0.01         0.14         -0.04             4596
## 97  1976        -0.07        -0.23         -0.01             4864
## 98  1977         0.21         0.25          0.19             5016
## 99  1978         0.12         0.10          0.12             5074
## 100 1979         0.23         0.17          0.24             5357
## 101 1980         0.28         0.31          0.26             5301
## 102 1981         0.32         0.52          0.25             5138
## 103 1982         0.19         0.11          0.22             5094
## 104 1983         0.36         0.50          0.30             5075
## 105 1984         0.17         0.06          0.20             5258
## 106 1985         0.16         0.10          0.18             5417
## 107 1986         0.23         0.30          0.21             5583
## 108 1987         0.38         0.45          0.36             5725
## 109 1988         0.39         0.58          0.32             5936
## 110 1989         0.29         0.36          0.27             6066
## 111 1990         0.45         0.66          0.37             6074
## 112 1991         0.39         0.53          0.34             6142
## 113 1992         0.24         0.24          0.23             6078
## 114 1993         0.28         0.35          0.25             6070
## 115 1994         0.34         0.48          0.29             6174
## 116 1995         0.47         0.78          0.35             6305
## 117 1996         0.32         0.35          0.31             6448
## 118 1997         0.51         0.64          0.46             6556
## 119 1998         0.65         0.98          0.52             6576
## 120 1999         0.44         0.78          0.31             6561
## 121 2000         0.42         0.62          0.34             6733
## 122 2001         0.57         0.84          0.46             6893
## 123 2002         0.62         0.95          0.49             6994
## 124 2003         0.63         0.94          0.52             7376
## 125 2004         0.58         0.81          0.49             7743
## 126 2005         0.66         1.08          0.50             8042
## 127 2006         0.63         0.97          0.50             8336
## 128 2007         0.61         1.12          0.43             8503
## 129 2008         0.54         0.89          0.41             8776
## 130 2009         0.64         0.90          0.54             8697
## 131 2010         0.72         1.14          0.56             9128
## 132 2011         0.57         0.91          0.44             9503
## 133 2012         0.63         0.95          0.51             9673
## 134 2013         0.67         1.03          0.53             9773
## 135 2014         0.73         1.01          0.63             9855
## 136 2015         0.92         1.39          0.75               NA
## 137 2016         0.98         1.50          0.79               NA
## 138 2017         0.90         1.38          0.72               NA
## 139 2018         0.82         1.18          0.68               NA

El problema al que nos tenemos que enfrentar es imprimir por pantalla la media de cada año de la anomalía de temperatura de mar y tierra. Esto lo podemos hacer con la función mean(). Si la pasamos por print() tendremos lo que queremos: print(mean()). De este modo para obtener la media del año 1880, que es la fila 1, podríamos hacer: print(mean(carbon[1,3],carbon[1,4])). Con la notación en los corchetes le estamos diciendo que nos localice el dato de la fila 1, columna 3, y el dato de la fila 1, columna 4. Dentro de mean, ambos, separados por comas, nos permiten hacer nuestro cálculo. Si cambiamos la fila 1 por i para el bucle que veis a continuación, nos permite ir, fila a fila calculando y mostrando las medias. Es decir, i se va a ir convirtiendo en los números del 1 hasta el número de filas de nuestro objeto carbon y eso nos va a permitir utilizarlo como índice para decirle a nuestro programa a qué fila nos referimos para acceder a los datos.

for(i in 1:nrow(carbon)){
  print(mean(carbon[i,3],carbon[i,4]))
  
}

Almacenando la información de los cálculos:

Pero si ahora tenemos que gurdar esos datos, nada de lo que haga el bucle se guardará: lo que se hace en el bucle se queda en el bucle a menos que especifiquemos líneas de código que guarden los datos en un objeto creado antes de hacer el bucle.

Vamos a hacer entonces un objeto vacío llamado anomalia que nos sirva de almacenaje. La funcion data.frame nos los permite: especificamos el nombre de cada variable y con = espeicficamos qué función queremos usar para que nos convierta al tipo de dato deseado: enteros para la columna año, decimal para la media. Entonces en la columna año podremos almacenar el año al que se refiere la media calculada, en la columna anomalia:

anomalia<-data.frame(año=as.integer(),
                     anomalia=as.double())

El resultado es un dataframe con dos columnas, y sin filas.

Ahora ya podemos ejecutar el bucle. Pero hay diferencias. Después de iniciarse, las 4 líneas de código nos hacen lo siguiente:

for(i in 1:nrow(carbon)){
  año_temp<-carbon[i,1]
  mean_temp<-mean(carbon[i,3],carbon[i,4])
  anomalia[i,1]<-año_temp
  anomalia[i,2]<-mean_temp
}

Cargamos ggplot2 para visualizar la trayectoria de la medias oceánica-terrestre

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 3.5.3
ggplot(anomalia,aes(x=año,y=anomalia))+geom_line()