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.
Vamos a cargar en primer lugar el archivo temp_carbon.csv
que 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]))
}
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:
mean_temp
.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()