Рубрики
Без рубрики

Наука о данных с Python & R: Фреймы данных I

В этой серии учебных пособий по науке о данных будет предпринята попытка сравнить, как различные концепции этой дисциплины могут быть реализованы в двух доминирующих в настоящее время экосистемах: R и Python.

Автор оригинала: Jose A Dianes.

Мотивация

В этой серии учебных пособий по науке о данных будет предпринята попытка сравнить, как различные концепции этой дисциплины могут быть реализованы в двух доминирующих в настоящее время экосистемах: R и Python. Мы сделаем это с нейтральной точки зрения. Мы считаем, что в каждой среде есть хорошие и плохие вещи, и любой специалист по данным должен знать, как использовать и то, и другое, чтобы быть максимально подготовленным к рынку труда или начать личный проект.

Чтобы получить представление о том, что происходит с этой горячей темой, мы отсылаем читателя к инфографике Datacamp’s Data Science War infographic. Их инфографика исследует, каковы сильные стороны R над Python и наоборот, и стремится обеспечить базовое сравнение между этими двумя языками программирования с точки зрения науки о данных и статистики.

Отнюдь не являясь повторением предыдущего, наша серия учебных пособий будет посвящена практическому выполнению различных задач в области науки о данных, таких как работа с фреймами данных, агрегирование данных или создание различных статистических моделей, например, в области контролируемого и неконтролируемого обучения.

Как обычно, мы будем использовать реальные наборы данных. Это поможет нам быстро перенести то, что мы узнаем здесь, в реальные ситуации анализа данных.

Первый учебник в нашей серии будет посвящен важной абстракции-фрейму данных. В следующем уроке мы представим одну из первых задач, с которой мы сталкиваемся, когда загружаем наши данные, – Исследовательский анализ данных. Эта задача может быть выполнена с использованием фреймов данных и базовых графиков, как мы покажем здесь как для Python, так и для R.

Весь исходный код для различных частей этой серии учебных пособий и приложений можно проверить на GitHub . Не стесняйтесь участвовать и делиться с нами своими успехами!

Что такое фрейм данных?

Фрейм данных используется для хранения табличных данных. Он имеет помеченные оси (строки и столбцы), которые мы можем использовать для выполнения арифметических операций на уровнях on.

Эта концепция была введена в R до того, как она появилась в Python Pandas , поэтому более поздняя повторяет многие идеи из первой. В R a data.frame – это список векторных переменных одного и того же числа элементов (строк) с уникальными именами строк. То есть каждый столбец-это вектор с соответствующим именем, а каждая строка-это ряд векторных элементов, соответствующих одной и той же позиции в каждом из столбцов-векторов.

В Pandas фрейм данных можно рассматривать как dict-подобный контейнер для объектов Series , где a Series является одномерным NumPy ndarray с метками осей (включая временные ряды). По умолчанию каждый Ряд соответствует столбцу в результирующем фрейме данных .

Но давайте рассмотрим оба типа данных на практике. Прежде всего мы представим набор данных, который будет использоваться для объяснения процесса создания фрейма данных и того, какие задачи анализа данных могут быть выполнены с помощью фрейма данных. Затем у нас будет отдельный раздел для каждой платформы, повторяющий каждую задачу, чтобы вы могли легко переходить с одной платформы на другую в будущем.

Знакомство с наборами данных Gapminder World

Веб-сайт Gapminder представляет себя как основанное на фактах мировоззрение . Это всеобъемлющий ресурс для сбора данных по показателям различных стран и территорий. Его раздел Data содержит список наборов данных, к которым можно получить доступ в виде страниц электронных таблиц Google (add &output=csv to download as CSV). Каждый набор данных индикаторов помечается как Поставщик данных , Категория и Подкатегория .

Для этого урока мы будем использовать различные наборы данных, связанные с инфекционным туберкулезом:

Первое, что нам нужно сделать, это загрузить файлы для последующего использования в наших средах R и Python. Существует описание каждого набора данных, если мы щелкнем по его названию в списке наборов данных . При выполнении любой задачи анализа данных важно понимать наши данные как можно лучше, поэтому идите туда и прочтите. В основном каждая ячейка в наборе данных содержит данные, связанные с количеством случаев заболевания туберкулезом на 100 тысяч человек в течение данного года (столбец) для каждой страны или региона (строка).

Мы будем использовать эти наборы данных, чтобы лучше понять заболеваемость туберкулезом в различных регионах во времени.

Загрузка файлов и чтение CSV

Питон

Загрузите данные электронной таблицы Google в формате CSV.

import urllib

tb_deaths_url_csv = 'https://docs.google.com/spreadsheets/d/12uWVH_IlmzJX_75bJ3IH5E-Gqx6-zfbDKNvZqYjUuso/pub?gid=0&output=CSV'
tb_existing_url_csv = 'https://docs.google.com/spreadsheets/d/1X5Jp7Q8pTs3KLJ5JBWKhncVACGsg5v4xu6badNs4C7I/pub?gid=0&output=csv'
tb_new_url_csv = 'https://docs.google.com/spreadsheets/d/1Pl51PcEGlO9Hp4Uh0x2_QM0xVb53p2UDBMPwcnSjFTk/pub?gid=0&output=csv'

local_tb_deaths_file = 'tb_deaths_100.csv'
local_tb_existing_file = 'tb_existing_100.csv'
local_tb_new_file = 'tb_new_100.csv'

deaths_f = urllib.urlretrieve(tb_deaths_url_csv, local_tb_deaths_file)
existing_f = urllib.urlretrieve(tb_existing_url_csv, local_tb_existing_file)
new_f = urllib.urlretrieve(tb_new_url_csv, local_tb_new_file)

Считайте CSV в Фрейм данных с помощью read_csv() .

import pandas as pd

deaths_df = pd.read_csv(local_tb_deaths_file, index_col = 0, thousands  = ',').T
existing_df = pd.read_csv(local_tb_existing_file, index_col = 0, thousands  = ',').T
new_df = pd.read_csv(local_tb_new_file, index_col = 0, thousands  = ',').T

Мы указали index_col равным 0, так как хотим, чтобы названия стран были метками строк. Мы также указали разделитель thousands как’, поэтому Панды автоматически разбирают ячейки как числа. Затем мы транспонируем таблицу, чтобы временные ряды для каждой страны соответствовали каждому столбцу.

На некоторое время мы сосредоточимся на существующих делах. Мы можем использовать head() для проверки первых нескольких строк.

existing_df.head()
265 514 436 42 45 39 52 35 278 38 365 409 96 46 114 436 42 126 55 16 1990
261 514 456 40 44 37 49 34 268 38 361 417 91 45 105 429 14 352 54 15 1991
263 513 494 41 44 35 51 33 259 37 358 415 86 44 102 422 4 64 54 15 1992
253 512 526 42 43 33 55 32 250 37 354 419 82 43 118 415 18 174 52 14 1993
250 510 556 42 43 32 60 31 242 36 350 426 78 42 116 407 17 172 52 13 1994
5 строк × 207 столбцов

С помощью атрибута columns мы можем читать и записывать имена столбцов.

existing_df.columns
Index([u'Afghanistan', u'Albania', u'Algeria', u'American Samoa', u'Andorra', u'Angola', u'Anguilla', u'Antigua and Barbuda', u'Argentina', u'Armenia', u'Australia', u'Austria', u'Azerbaijan', u'Bahamas', u'Bahrain', u'Bangladesh', u'Barbados', u'Belarus', u'Belgium', u'Belize', u'Benin', u'Bermuda', u'Bhutan', u'Bolivia', u'Bosnia and Herzegovina', u'Botswana', u'Brazil', u'British Virgin Islands', u'Brunei Darussalam', u'Bulgaria', u'Burkina Faso', u'Burundi', u'Cambodia', u'Cameroon', u'Canada', u'Cape Verde', u'Cayman Islands', u'Central African Republic', u'Chad', u'Chile', u'China', u'Colombia', u'Comoros', u'Congo, Rep.', u'Cook Islands', u'Costa Rica', u'Croatia', u'Cuba', u'Cyprus', u'Czech Republic', u'Cote dIvoire', u'Korea, Dem. Rep.', u'Congo, Dem. Rep.', u'Denmark', u'Djibouti', u'Dominica', u'Dominican Republic', u'Ecuador', u'Egypt', u'El Salvador', u'Equatorial Guinea', u'Eritrea', u'Estonia', u'Ethiopia', u'Fiji', u'Finland', u'France', u'French Polynesia', u'Gabon', u'Gambia', u'Georgia', u'Germany', u'Ghana', u'Greece', u'Grenada', u'Guam', u'Guatemala', u'Guinea', u'Guinea-Bissau', u'Guyana', u'Haiti', u'Honduras', u'Hungary', u'Iceland', u'India', u'Indonesia', u'Iran', u'Iraq', u'Ireland', u'Israel', u'Italy', u'Jamaica', u'Japan', u'Jordan', u'Kazakhstan', u'Kenya', u'Kiribati', u'Kuwait', u'Kyrgyzstan', u'Laos', ...], dtype='object')

Аналогично, мы можем получить доступ к именам строк с помощью index .

existing_df.index
Index([u'1990', u'1991', u'1992', u'1993', u'1994', u'1995', u'1996', u'1997', u'1998', u'1999', u'2000', u'2001', u'2002', u'2003', u'2004', u'2005', u'2006', u'2007'], dtype='object')

Мы будем использовать их для присвоения имен собственных нашим именам столбцов и индексов.

deaths_df.index.names = ['year']
deaths_df.columns.names = ['country']
existing_df.index.names = ['year']
existing_df.columns.names = ['country']
new_df.index.names = ['year']
new_df.columns.names = ['country']
existing_df
год
265 514 436 42 45 39 52 35 278 1990 38 365 409 96 46 114 436 42 126 55 16
261 514 456 40 44 37 49 34 268 1991 38 361 417 91 45 105 429 14 352 54 15
263 513 494 41 44 35 51 33 259 1992 37 358 415 86 44 102 422 4 64 54 15
253 512 526 42 43 33 55 32 250 1993 37 354 419 82 43 118 415 18 174 52 14
250 510 556 42 43 32 60 31 242 1994 36 350 426 78 42 116 407 17 172 52 13
244 508 585 43 42 30 68 30 234 1995 35 346 439 74 42 119 397 22 93 50 12
233 512 602 42 43 28 74 28 226 1996 35 312 453 71 41 111 397 0 123 49 12
207 363 626 44 44 23 75 27 218 1997 36 273 481 67 41 122 387 25 213 46 11
194 414 634 43 45 24 74 28 211 1998 36 261 392 63 40 129 374 12 107 44 11
175 384 657 42 46 22 86 28 159 1999 36 253 430 58 39 134 373 8 105 42 9
164 530 658 40 48 20 94 27 143 2000 35 248 479 52 39 139 346 8 103 40 8
154 335 680 34 49 20 99 25 128 2001 35 243 523 51 41 148 326 6 13 39 9
149 307 517 32 50 21 97 27 149 2002 35 235 571 42 41 144 304 5 275 37 7
146 281 478 32 51 18 91 25 128 2003 35 234 632 41 39 152 308 6 147 36 9
138 318 468 29 52 19 85 23 118 2004 35 226 652 39 38 149 283 9 63 35 8
137 331 453 29 53 18 79 24 131 2005 34 227 680 39 38 144 267 11 57 33 8
135 302 422 26 55 17 79 25 104 2006 34 222 699 37 38 134 251 9 60 32 9
130 294 387 22 56 19 81 23 102 2007 34 220 714 35 39 140 238 5 25 31 9

R

В R мы используем read.csv для чтения CSV-файлов в data.frame переменные. Хотя функция R read.csv может работать с URL-адресами, https во многих случаях является проблемой для R, поэтому вам нужно использовать такой пакет, как RCurl, чтобы обойти его.

library(RCurl)
## Loading required package: bitops
existing_cases_file <- getURL("https://docs.google.com/spreadsheets/d/1X5Jp7Q8pTs3KLJ5JBWKhncVACGsg5v4xu6badNs4C7I/pub?gid=0&output=csv")
existing_df <- read.csv(text = existing_cases_file, row.names=1, stringsAsFactor=F)
str(existing_df)
## 'data.frame':	207 obs. of  18 variables:
##  $ X1990: chr  "436" "42" "45" "42" ...
##  $ X1991: chr  "429" "40" "44" "14" ...
##  $ X1992: chr  "422" "41" "44" "4" ...
##  $ X1993: chr  "415" "42" "43" "18" ...
##  $ X1994: chr  "407" "42" "43" "17" ...
##  $ X1995: chr  "397" "43" "42" "22" ...
##  $ X1996: int  397 42 43 0 28 512 35 12 71 74 ...
##  $ X1997: int  387 44 44 25 23 363 36 11 67 75 ...
##  $ X1998: int  374 43 45 12 24 414 36 11 63 74 ...
##  $ X1999: int  373 42 46 8 22 384 36 9 58 86 ...
##  $ X2000: int  346 40 48 8 20 530 35 8 52 94 ...
##  $ X2001: int  326 34 49 6 20 335 35 9 51 99 ...
##  $ X2002: int  304 32 50 5 21 307 35 7 42 97 ...
##  $ X2003: int  308 32 51 6 18 281 35 9 41 91 ...
##  $ X2004: chr  "283" "29" "52" "9" ...
##  $ X2005: chr  "267" "29" "53" "11" ...
##  $ X2006: chr  "251" "26" "55" "9" ...
##  $ X2007: chr  "238" "22" "56" "5" ...

Функция str() в R дает нам информацию о типе переменной. В этом случае мы видим, что из-за разделителя , тысячи некоторые столбцы были проанализированы не как числа, а как символы. Если мы хотим правильно работать с нашим набором данных, нам нужно преобразовать их в числа. Как только мы узнаем немного больше об индексации и функциях отображения, я обещаю, что вы сможете понять следующий фрагмент кода. По know предположим, что мы преобразуем столбец и снова присваиваем его ссылке в фрейме данных.

existing_df[c(1,2,3,4,5,6,15,16,17,18)] <- 
    lapply( existing_df[c(1,2,3,4,5,6,15,16,17,18)], 
            function(x) { as.integer(gsub(',', '', x) )})
str(existing_df)
## 'data.frame':	207 obs. of  18 variables:
##  $ X1990: int  436 42 45 42 39 514 38 16 96 52 ...
##  $ X1991: int  429 40 44 14 37 514 38 15 91 49 ...
##  $ X1992: int  422 41 44 4 35 513 37 15 86 51 ...
##  $ X1993: int  415 42 43 18 33 512 37 14 82 55 ...
##  $ X1994: int  407 42 43 17 32 510 36 13 78 60 ...
##  $ X1995: int  397 43 42 22 30 508 35 12 74 68 ...
##  $ X1996: int  397 42 43 0 28 512 35 12 71 74 ...
##  $ X1997: int  387 44 44 25 23 363 36 11 67 75 ...
##  $ X1998: int  374 43 45 12 24 414 36 11 63 74 ...
##  $ X1999: int  373 42 46 8 22 384 36 9 58 86 ...
##  $ X2000: int  346 40 48 8 20 530 35 8 52 94 ...
##  $ X2001: int  326 34 49 6 20 335 35 9 51 99 ...
##  $ X2002: int  304 32 50 5 21 307 35 7 42 97 ...
##  $ X2003: int  308 32 51 6 18 281 35 9 41 91 ...
##  $ X2004: int  283 29 52 9 19 318 35 8 39 85 ...
##  $ X2005: int  267 29 53 11 18 331 34 8 39 79 ...
##  $ X2006: int  251 26 55 9 17 302 34 9 37 79 ...
##  $ X2007: int  238 22 56 5 19 294 34 9 35 81 ...

Теперь все выглядит прекрасно. Но все же наш набор данных немного сложен. Если у нас есть посмотрите, что мы получили в кадр данных с головой

head(existing_df,3)
##             X1990 X1991 X1992 X1993 X1994 X1995 X1996 X1997 X1998 X1999
## Afghanistan   436   429   422   415   407   397   397   387   374   373
## Albania        42    40    41    42    42    43    42    44    43    42
## Algeria        45    44    44    43    43    42    43    44    45    46
##             X2000 X2001 X2002 X2003 X2004 X2005 X2006 X2007
## Afghanistan   346   326   304   308   283   267   251   238
## Albania        40    34    32    32    29    29    26    22
## Algeria        48    49    50    51    52    53    55    56

и nrow и ncol

nrow(existing_df)
## [1] 207
ncol(existing_df)
## [1] 18

Мы видим, что у нас есть фрейм данных с 207 наблюдениями, по одному для каждой страны, и 19 переменными или признаками, по одному для каждого года. Это не кажется самой естественной формой для этого набора данных. Очень маловероятно, что мы добавим новые страны (наблюдения или строки в данном случае) в набор данных, в то время как вполне возможно добавить дополнительные годы (переменные или столбцы в этом случае). Если мы сохраним его таким, как он есть, мы получим набор данных, который растет в объектах, а не в наблюдениях, и это кажется нелогичным (и непрактичным в зависимости от анализа, который мы хотим сделать).

Нам не нужно будет делать эту предварительную обработку все время, но там мы идем. К счастью, как функция t() аналогична методу T в Pandas, что позволяет нам транспонировать переменную data.frame . Результат задается в виде матрицы , поэтому нам нужно снова преобразовать его в фрейм данных, используя as.data.frame .

# we will save the "trasposed" original verison for later use if needed
existing_df_t <- existing_df 
existing_df <- as.data.frame(t(existing_df))
head(existing_df,3)
##       Afghanistan Albania Algeria American Samoa Andorra Angola Anguilla
## X1990         436      42      45             42      39    514       38
## X1991         429      40      44             14      37    514       38
## X1992         422      41      44              4      35    513       37
##       Antigua and Barbuda Argentina Armenia Australia Austria Azerbaijan
## X1990                  16        96      52         7      18         58
## X1991                  15        91      49         7      17         55
## X1992                  15        86      51         7      16         57
##       Bahamas Bahrain Bangladesh Barbados Belarus Belgium Belize Benin
## X1990      54     120        639        8      62      16     65   140
## X1991      53     113        623        8      54      15     64   138
## X1992      52     108        608        7      59      15     62   135
##       Bermuda Bhutan Bolivia Bosnia and Herzegovina Botswana Brazil
## X1990      10    924     377                    160      344    124
## X1991      10    862     362                    156      355    119
## X1992       9    804     347                    154      351    114
##       British Virgin Islands Brunei Darussalam Bulgaria Burkina Faso
## X1990                     32                91       43          179
## X1991                     30                91       48          196
## X1992                     28                91       54          208
##       Burundi Cambodia Cameroon Canada Cape Verde Cayman Islands
## X1990     288      928      188      7        449             10
## X1991     302      905      199      7        438             10
## X1992     292      881      200      7        428              9
##       Central African Republic Chad Chile China Colombia Comoros
## X1990                      318  251    45   327       88     188
## X1991                      336  272    41   321       85     177
## X1992                      342  282    38   315       82     167
##       Congo, Rep. Cook Islands Costa Rica Croatia Cuba Cyprus
## X1990         209            0         30     126   32     14
## X1991         222           10         28     123   29     13
## X1992         231           57         27     121   26     13
##       Czech Republic Cote d'Ivoire Korea, Dem. Rep. Congo, Dem. Rep.
## X1990             22           292              841              275
## X1991             22           304              828              306
## X1992             22           306              815              327
##       Denmark Djibouti Dominica Dominican Republic Ecuador Egypt
## X1990      12    1,485       24                183     282    48
## X1991      12    1,477       24                173     271    47
## X1992      11    1,463       24                164     259    47
##       El Salvador Equatorial Guinea Eritrea Estonia Ethiopia Fiji Finland
## X1990         133               169     245      50      312   68      14
## X1991         126               181     245      50      337   65      12
## X1992         119               187     242      56      351   62      11
##       France French Polynesia Gabon Gambia Georgia Germany Ghana Greece
## X1990     21               67   359    350      51      15   533     30
## X1991     20               55   340    350      48      15   519     29
## X1992     19               91   325    349      50      14   502     27
##       Grenada Guam Guatemala Guinea Guinea-Bissau Guyana Haiti Honduras
## X1990       7  103       113    241           404     39   479      141
## X1991       7  101       111    248           403     43   464      133
## X1992       7   96       108    255           402     34   453      128
##       Hungary Iceland India Indonesia Iran Iraq Ireland Israel Italy
## X1990      67       5   586       443   50   88      19     11    11
## X1991      68       4   577       430   51   88      18     10    10
## X1992      70       4   566       417   56   88      18     10    10
##       Jamaica Japan Jordan Kazakhstan Kenya Kiribati Kuwait Kyrgyzstan
## X1990      10    62     19         95   125    1,026     89         90
## X1991      10    60     18         87   120    1,006     84         93
## X1992      10    58     17         85   134      986     80         93
##       Laos Latvia Lebanon Lesotho Liberia Libyan Arab Jamahiriya Lithuania
## X1990  428     56      64     225     476                     46        64
## X1991  424     57      64     231     473                     45        66
## X1992  420     59      63     229     469                     45        71
##       Luxembourg Madagascar Malawi Malaysia Maldives Mali Malta Mauritania
## X1990         19        367    380      159      143  640    10        585
## X1991         18        368    376      158      130  631     9        587
## X1992         17        369    365      156      118  621     9        590
##       Mauritius Mexico Micronesia, Fed. Sts. Monaco Mongolia Montserrat
## X1990        53    101                   263      3      477         14
## X1991        51     93                   253      3      477         14
## X1992        50     86                   244      3      477         14
##       Morocco Mozambique Myanmar Namibia Nauru Nepal Netherlands
## X1990     134        287     411     650   170   629          11
## X1991     130        313     400     685   285   607          10
## X1992     127        328     389     687   280   585          10
##       Netherlands Antilles New Caledonia New Zealand Nicaragua Niger
## X1990                   28           112          10       145   317
## X1991                   27           107          10       137   318
## X1992                   25           104           9       129   319
##       Nigeria Niue Northern Mariana Islands Norway Oman Pakistan Palau
## X1990     282  118                      142      8   40      430    96
## X1991     307  115                      201      8   36      428    66
## X1992     321  113                      301      8   29      427    43
##       Panama Papua New Guinea Paraguay Peru Philippines Poland Portugal
## X1990     74              498       95  394         799     88       51
## X1991     73              498       93  368         783     87       49
## X1992     71              497       92  343         766     86       47
##       Puerto Rico Qatar Korea, Rep. Moldova Romania Russian Federation
## X1990          17    71         223     105     118                 69
## X1991          15    69         196      99     125                 64
## X1992          17    69         174     103     134                 70
##       Rwanda Saint Kitts and Nevis Saint Lucia
## X1990    190                    17          26
## X1991    211                    17          26
## X1992    226                    16          25
##       Saint Vincent and the Grenadines Samoa San Marino
## X1990                               45    36          9
## X1991                               45    35          9
## X1992                               44    34          8
##       Sao Tome and Principe Saudi Arabia Senegal Seychelles Sierra Leone
## X1990                   346           68     380        113          465
## X1991                   335           60     379        110          479
## X1992                   325           59     379        106          492
##       Singapore Slovakia Slovenia Solomon Islands Somalia South Africa
## X1990        52       55       66             625     597          769
## X1991        52       56       62             593     587          726
## X1992        53       59       59             563     577          676
##       Spain Sri Lanka Sudan Suriname Swaziland Sweden Switzerland
## X1990    44       109   409      109       629      5          14
## X1991    42       106   404      100       590      5          13
## X1992    40       104   402       79       527      6          12
##       Syrian Arab Republic Tajikistan Thailand Macedonia, FYR Timor-Leste
## X1990                   94        193      336             92         706
## X1991                   89        162      319             90         694
## X1992                   84        112      307             89         681
##       Togo Tokelau Tonga Trinidad and Tobago Tunisia Turkey Turkmenistan
## X1990  702     139    45                  17      49     83          105
## X1991  687     140    44                  17      46     79           99
## X1992  668     143    43                  17      49     77          101
##       Turks and Caicos Islands Tuvalu Uganda Ukraine United Arab Emirates
## X1990                       42    593    206      67                   47
## X1991                       40    573    313      64                   44
## X1992                       37    554    342      67                   42
##       United Kingdom Tanzania Virgin Islands (U.S.)
## X1990              9      215                    30
## X1991              9      228                    28
## X1992             10      240                    27
##       United States of America Uruguay Uzbekistan Vanuatu Venezuela
## X1990                        7      35        114     278        46
## X1991                        7      34        105     268        45
## X1992                        7      33        102     259        44
##       Viet Nam Wallis et Futuna West Bank and Gaza Yemen Zambia Zimbabwe
## X1990      365              126                 55   265    436      409
## X1991      361              352                 54   261    456      417
## X1992      358               64                 54   263    494      415

Имена строк-это то, что мы получаем в Панд, когда используем атрибут .index во фрейме данных.

rownames(existing_df)
##  [1] "X1990" "X1991" "X1992" "X1993" "X1994" "X1995" "X1996" "X1997"
##  [9] "X1998" "X1999" "X2000" "X2001" "X2002" "X2003" "X2004" "X2005"
## [17] "X2006" "X2007"

В нашем фрейме данных мы видим, что у нас есть странные имена для них. Каждый год имеет префикс X. Это происходит потому, что они начинались как имена столбцов. Из определения a data.frame в R мы знаем, что каждый столбец является вектором с именем переменной. Имя в R не может начинаться с цифры, s или автоматически префиксов чисел с буквы X. Правильно, мы оставим его таким, как оно есть, поскольку это на самом деле не мешает нам проводить наш анализ.

В случае имен столбцов они в значительной степени соответствуют атрибуту Pandas .columns во фрейме данных.

colnames(existing_df)
##   [1] "Afghanistan"                      "Albania"                         
##   [3] "Algeria"                          "American Samoa"                  
##   [5] "Andorra"                          "Angola"                          
##   [7] "Anguilla"                         "Antigua and Barbuda"             
##   [9] "Argentina"                        "Armenia"                         
##  [11] "Australia"                        "Austria"                         
##  [13] "Azerbaijan"                       "Bahamas"                         
##  [15] "Bahrain"                          "Bangladesh"                      
##  [17] "Barbados"                         "Belarus"                         
##  [19] "Belgium"                          "Belize"                          
##  [21] "Benin"                            "Bermuda"                         
##  [23] "Bhutan"                           "Bolivia"                         
##  [25] "Bosnia and Herzegovina"           "Botswana"                        
##  [27] "Brazil"                           "British Virgin Islands"          
##  [29] "Brunei Darussalam"                "Bulgaria"                        
##  [31] "Burkina Faso"                     "Burundi"                         
##  [33] "Cambodia"                         "Cameroon"                        
##  [35] "Canada"                           "Cape Verde"                      
##  [37] "Cayman Islands"                   "Central African Republic"        
##  [39] "Chad"                             "Chile"                           
##  [41] "China"                            "Colombia"                        
##  [43] "Comoros"                          "Congo, Rep."                     
##  [45] "Cook Islands"                     "Costa Rica"                      
##  [47] "Croatia"                          "Cuba"                            
##  [49] "Cyprus"                           "Czech Republic"                  
##  [51] "Cote d'Ivoire"                    "Korea, Dem. Rep."                
##  [53] "Congo, Dem. Rep."                 "Denmark"                         
##  [55] "Djibouti"                         "Dominica"                        
##  [57] "Dominican Republic"               "Ecuador"                         
##  [59] "Egypt"                            "El Salvador"                     
##  [61] "Equatorial Guinea"                "Eritrea"                         
##  [63] "Estonia"                          "Ethiopia"                        
##  [65] "Fiji"                             "Finland"                         
##  [67] "France"                           "French Polynesia"                
##  [69] "Gabon"                            "Gambia"                          
##  [71] "Georgia"                          "Germany"                         
##  [73] "Ghana"                            "Greece"                          
##  [75] "Grenada"                          "Guam"                            
##  [77] "Guatemala"                        "Guinea"                          
##  [79] "Guinea-Bissau"                    "Guyana"                          
##  [81] "Haiti"                            "Honduras"                        
##  [83] "Hungary"                          "Iceland"                         
##  [85] "India"                            "Indonesia"                       
##  [87] "Iran"                             "Iraq"                            
##  [89] "Ireland"                          "Israel"                          
##  [91] "Italy"                            "Jamaica"                         
##  [93] "Japan"                            "Jordan"                          
##  [95] "Kazakhstan"                       "Kenya"                           
##  [97] "Kiribati"                         "Kuwait"                          
##  [99] "Kyrgyzstan"                       "Laos"                            
## [101] "Latvia"                           "Lebanon"                         
## [103] "Lesotho"                          "Liberia"                         
## [105] "Libyan Arab Jamahiriya"           "Lithuania"                       
## [107] "Luxembourg"                       "Madagascar"                      
## [109] "Malawi"                           "Malaysia"                        
## [111] "Maldives"                         "Mali"                            
## [113] "Malta"                            "Mauritania"                      
## [115] "Mauritius"                        "Mexico"                          
## [117] "Micronesia, Fed. Sts."            "Monaco"                          
## [119] "Mongolia"                         "Montserrat"                      
## [121] "Morocco"                          "Mozambique"                      
## [123] "Myanmar"                          "Namibia"                         
## [125] "Nauru"                            "Nepal"                           
## [127] "Netherlands"                      "Netherlands Antilles"            
## [129] "New Caledonia"                    "New Zealand"                     
## [131] "Nicaragua"                        "Niger"                           
## [133] "Nigeria"                          "Niue"                            
## [135] "Northern Mariana Islands"         "Norway"                          
## [137] "Oman"                             "Pakistan"                        
## [139] "Palau"                            "Panama"                          
## [141] "Papua New Guinea"                 "Paraguay"                        
## [143] "Peru"                             "Philippines"                     
## [145] "Poland"                           "Portugal"                        
## [147] "Puerto Rico"                      "Qatar"                           
## [149] "Korea, Rep."                      "Moldova"                         
## [151] "Romania"                          "Russian Federation"              
## [153] "Rwanda"                           "Saint Kitts and Nevis"           
## [155] "Saint Lucia"                      "Saint Vincent and the Grenadines"
## [157] "Samoa"                            "San Marino"                      
## [159] "Sao Tome and Principe"            "Saudi Arabia"                    
## [161] "Senegal"                          "Seychelles"                      
## [163] "Sierra Leone"                     "Singapore"                       
## [165] "Slovakia"                         "Slovenia"                        
## [167] "Solomon Islands"                  "Somalia"                         
## [169] "South Africa"                     "Spain"                           
## [171] "Sri Lanka"                        "Sudan"                           
## [173] "Suriname"                         "Swaziland"                       
## [175] "Sweden"                           "Switzerland"                     
## [177] "Syrian Arab Republic"             "Tajikistan"                      
## [179] "Thailand"                         "Macedonia, FYR"                  
## [181] "Timor-Leste"                      "Togo"                            
## [183] "Tokelau"                          "Tonga"                           
## [185] "Trinidad and Tobago"              "Tunisia"                         
## [187] "Turkey"                           "Turkmenistan"                    
## [189] "Turks and Caicos Islands"         "Tuvalu"                          
## [191] "Uganda"                           "Ukraine"                         
## [193] "United Arab Emirates"             "United Kingdom"                  
## [195] "Tanzania"                         "Virgin Islands (U.S.)"           
## [197] "United States of America"         "Uruguay"                         
## [199] "Uzbekistan"                       "Vanuatu"                         
## [201] "Venezuela"                        "Viet Nam"                        
## [203] "Wallis et Futuna"                 "West Bank and Gaza"              
## [205] "Yemen"                            "Zambia"                          
## [207] "Zimbabwe"

Эти две функции показывают общую идиому в R, где мы используем одну и ту же функцию, чтобы получить значение и присвоить его. Например, если мы хотим изменить имена строк, мы сделаем что-то вроде:

colnames(existing_df) <- new_col_names

Но, как мы уже сказали, мы оставим их такими, какие они есть.

Индексация данных

Питон

В официальной документации есть целый раздел , посвященный индексации и отбору данных в фреймах данных . Давайте применим их к нашей структуре данных о случаях туберкулеза.

Мы можем получить доступ к каждому объекту фрейма данных Series , используя его имя столбца, как в словаре Python. В нашем случае мы можем получить доступ к каждой серии стран по ее названию.

existing_df['United Kingdom']
    year
    1990     9
    1991     9
    1992    10
    1993    10
    1994     9
    1995     9
    1996     9
    1997     9
    1998     9
    1999     9
    2000     9
    2001     9
    2002     9
    2003    10
    2004    10
    2005    11
    2006    11
    2007    12
    Name: United Kingdom, dtype: int64

Или просто использовать значение ключа в качестве атрибута.

 existing_df.Spain
    year
    1990    44
    1991    42
    1992    40
    1993    37
    1994    35
    1995    34
    1996    33
    1997    30
    1998    30
    1999    28
    2000    27
    2001    26
    2002    26
    2003    25
    2004    24
    2005    24
    2006    24
    2007    23
    Name: Spain, dtype: int64

Или мы можем получить доступ к нескольким сериям, передавая их имена столбцов в виде списка Python.

existing_df[['Spain', 'United Kingdom']]
год
44 1990 9
42 1991 9
40 1992 10
37 1993 10
35 1994 9
34 1995 9
33 1996 9
30 1997 9
30 1998 9
28 1999 9
27 2000 9
26 2001 9
26 2002 9
25 2003 10
24 2004 10
24 2005 11
24 2006 11
23 2007 12

Мы также можем получить доступ к отдельным ячейкам следующим образом.

existing_df.Spain['1990']
    44
```


Or using any Python list indexing for slicing the series.

```python
existing_df[['Spain', 'United Kingdom']][0:5]
```

| country | Spain | United Kingdom |
|---------|-------|----------------|
| year    |       |                |
| 1990    | 44    | 9              |
| 1991    | 42    | 9              |
| 1992    | 40    | 10             |
| 1993    | 37    | 10             |
| 1994    | 35    | 9              |


With the whole DataFrame, slicing inside of [] slices the rows. This is provided largely as a convenience since it is such a common operation.

```python
existing_df[0:5]
```

| country | Afghanistan | Albania | Algeria | American Samoa | Andorra | Angola | Anguilla | Antigua and Barbuda | Argentina | Armenia | ... | Uruguay | Uzbekistan | Vanuatu | Venezuela | Viet Nam | Wallis et Futuna | West Bank and Gaza | Yemen | Zambia | Zimbabwe |
|---------|-------------|---------|---------|----------------|---------|--------|----------|---------------------|-----------|---------|-----|---------|------------|---------|-----------|----------|------------------|--------------------|-------|--------|----------|
| year    |             |         |         |                |         |        |          |                     |           |         |     |         |            |         |           |          |                  |                    |       |        |          |
| 1990    | 436         | 42      | 45      | 42             | 39      | 514    | 38       | 16                  | 96        | 52      | ... | 35      | 114        | 278     | 46        | 365      | 126              | 55                 | 265   | 436    | 409      |
| 1991    | 429         | 40      | 44      | 14             | 37      | 514    | 38       | 15                  | 91        | 49      | ... | 34      | 105        | 268     | 45        | 361      | 352              | 54                 | 261   | 456    | 417      |
| 1992    | 422         | 41      | 44      | 4              | 35      | 513    | 37       | 15                  | 86        | 51      | ... | 33      | 102        | 259     | 44        | 358      | 64               | 54                 | 263   | 494    | 415      |
| 1993    | 415         | 42      | 43      | 18             | 33      | 512    | 37       | 14                  | 82        | 55      | ... | 32      | 118        | 250     | 43        | 354      | 174              | 52                 | 253   | 526    | 419      |
| 1994    | 407         | 42      | 43      | 17             | 32      | 510    | 36       | 13                  | 78        | 60      | ... | 31      | 116        | 242     | 42        | 350      | 172              | 52                 | 250   | 556    | 426      |

######5 rows × 207 columns


### Indexing in production Python code

As stated in the official documentation, the Python and NumPy indexing operators [] and attribute operator . provide quick and easy access to pandas data structures across a wide range of use cases. This makes interactive work intuitive, as there's little new to learn if you already know how to deal with Python dictionaries and NumPy arrays. However, since the type of the data to be accessed isn't known in advance, directly using standard operators has some optimization limits. For production code, it is recommended that you take advantage of the optimized pandas data access methods exposed in this section.

For example, the `.iloc` method can be used for **positional** index access.

```python
existing_df.iloc[0:2]
```

| country | Afghanistan | Albania | Algeria | American Samoa | Andorra | Angola | Anguilla | Antigua and Barbuda | Argentina | Armenia | ... | Uruguay | Uzbekistan | Vanuatu | Venezuela | Viet Nam | Wallis et Futuna | West Bank and Gaza | Yemen | Zambia | Zimbabwe |
|---------|-------------|---------|---------|----------------|---------|--------|----------|---------------------|-----------|---------|-----|---------|------------|---------|-----------|----------|------------------|--------------------|-------|--------|----------|
| year    |             |         |         |                |         |        |          |                     |           |         |     |         |            |         |           |          |                  |                    |       |        |          |
| 1990    | 436         | 42      | 45      | 42             | 39      | 514    | 38       | 16                  | 96        | 52      | ... | 35      | 114        | 278     | 46        | 365      | 126              | 55                 | 265   | 436    | 409      |
| 1991    | 429         | 40      | 44      | 14             | 37      | 514    | 38       | 15                  | 91        | 49      | ... | 34      | 105        | 268     | 45        | 361      | 352              | 54                 | 261   | 456    | 417      |

######2 rows × 207 columns


While `.loc` is used for **label** access.

```python
existing_df.loc['1992':'2005']
```

| country | Afghanistan | Albania | Algeria | American Samoa | Andorra | Angola | Anguilla | Antigua and Barbuda | Argentina | Armenia | ... | Uruguay | Uzbekistan | Vanuatu | Venezuela | Viet Nam | Wallis et Futuna | West Bank and Gaza | Yemen | Zambia | Zimbabwe |
|---------|-------------|---------|---------|----------------|---------|--------|----------|---------------------|-----------|---------|-----|---------|------------|---------|-----------|----------|------------------|--------------------|-------|--------|----------|
| year    |             |         |         |                |         |        |          |                     |           |         |     |         |            |         |           |          |                  |                    |       |        |          |
| 1992    | 422         | 41      | 44      | 4              | 35      | 513    | 37       | 15                  | 86        | 51      | ... | 33      | 102        | 259     | 44        | 358      | 64               | 54                 | 263   | 494    | 415      |
| 1993    | 415         | 42      | 43      | 18             | 33      | 512    | 37       | 14                  | 82        | 55      | ... | 32      | 118        | 250     | 43        | 354      | 174              | 52                 | 253   | 526    | 419      |
| 1994    | 407         | 42      | 43      | 17             | 32      | 510    | 36       | 13                  | 78        | 60      | ... | 31      | 116        | 242     | 42        | 350      | 172              | 52                 | 250   | 556    | 426      |
| 1995    | 397         | 43      | 42      | 22             | 30      | 508    | 35       | 12                  | 74        | 68      | ... | 30      | 119        | 234     | 42        | 346      | 93               | 50                 | 244   | 585    | 439      |
| 1996    | 397         | 42      | 43      | 0              | 28      | 512    | 35       | 12                  | 71        | 74      | ... | 28      | 111        | 226     | 41        | 312      | 123              | 49                 | 233   | 602    | 453      |
| 1997    | 387         | 44      | 44      | 25             | 23      | 363    | 36       | 11                  | 67        | 75      | ... | 27      | 122        | 218     | 41        | 273      | 213              | 46                 | 207   | 626    | 481      |
| 1998    | 374         | 43      | 45      | 12             | 24      | 414    | 36       | 11                  | 63        | 74      | ... | 28      | 129        | 211     | 40        | 261      | 107              | 44                 | 194   | 634    | 392      |
| 1999    | 373         | 42      | 46      | 8              | 22      | 384    | 36       | 9                   | 58        | 86      | ... | 28      | 134        | 159     | 39        | 253      | 105              | 42                 | 175   | 657    | 430      |
| 2000    | 346         | 40      | 48      | 8              | 20      | 530    | 35       | 8                   | 52        | 94      | ... | 27      | 139        | 143     | 39        | 248      | 103              | 40                 | 164   | 658    | 479      |
| 2001    | 326         | 34      | 49      | 6              | 20      | 335    | 35       | 9                   | 51        | 99      | ... | 25      | 148        | 128     | 41        | 243      | 13               | 39                 | 154   | 680    | 523      |
| 2002    | 304         | 32      | 50      | 5              | 21      | 307    | 35       | 7                   | 42        | 97      | ... | 27      | 144        | 149     | 41        | 235      | 275              | 37                 | 149   | 517    | 571      |
| 2003    | 308         | 32      | 51      | 6              | 18      | 281    | 35       | 9                   | 41        | 91      | ... | 25      | 152        | 128     | 39        | 234      | 147              | 36                 | 146   | 478    | 632      |
| 2004    | 283         | 29      | 52      | 9              | 19      | 318    | 35       | 8                   | 39        | 85      | ... | 23      | 149        | 118     | 38        | 226      | 63               | 35                 | 138   | 468    | 652      |
| 2005    | 267         | 29      | 53      | 11             | 18      | 331    | 34       | 8                   | 39        | 79      | ... | 24      | 144        | 131     | 38        | 227      | 57               | 33                 | 137   | 453    | 680      |

######14 rows × 207 columns


And we can combine that with series indexing by column.

```python
existing_df.loc[['1992','1998','2005'],['Spain','United Kingdom']]
```

| country | Spain | United Kingdom |
|---------|-------|----------------|
| 1992    | 40    | 10             |
| 1998    | 30    | 9              |
| 2005    | 24    | 11             |

This last approach is the recommended when using Pandas data frames, specially when doing assignments (something we are not doing here). Otherwise, we might have assignment problems as described [here](http://pandas-docs.github.io/pandas-docs-travis/indexing.html#why-does-the-assignment-when-using-chained-indexing-fail).

### R  

Similarly to what we do in Pandas (actually Pandas is inspired in R), we can
access a `data.frame` column by its position.  

```r
existing_df[,1]
```

```r
## X1990 X1991 X1992 X1993 X1994 X1995 X1996 X1997 X1998 X1999 X2000 X2001 
##   436   429   422   415   407   397   397   387   374   373   346   326 
## X2002 X2003 X2004 X2005 X2006 X2007 
##   304   308   283   267   251   238 
## 17 Levels: 238 251 267 283 304 308 326 346 373 374 387 397 407 415 ... 436
```

The position-based indexing in `R` uses the first element for the row number and
the second one for the column one. If left blank, we are telling R to get all
the row/columns. In the previous example we retrieved all the rows for the first
column (Afghanistan) in the `data.frame`. And yes, R has a **1-based** indexing 
schema.  

Like in Pandas, we can use column names to access columns (series in Pandas).
However R `data.frame` variables aren't exactly object and we don't use the `.`
operator but the `$` that allows accessing labels within a list.  

```r
existing_df$Afghanistan
```

```r
## X1990 X1991 X1992 X1993 X1994 X1995 X1996 X1997 X1998 X1999 X2000 X2001 
##   436   429   422   415   407   397   397   387   374   373   346   326 
## X2002 X2003 X2004 X2005 X2006 X2007 
##   304   308   283   267   251   238 
## 17 Levels: 238 251 267 283 304 308 326 346 373 374 387 397 407 415 ... 436
```

An finally, since a `data.frame` is a list of elements (its columns), we can access
columns as list elements using the list indexing operator `[[]]`.  

```r
existing_df[[1]]
```

```r
## X1990 X1991 X1992 X1993 X1994 X1995 X1996 X1997 X1998 X1999 X2000 X2001 
##   436   429   422   415   407   397   397   387   374   373   346   326 
## X2002 X2003 X2004 X2005 X2006 X2007 
##   304   308   283   267   251   238 
## 17 Levels: 238 251 267 283 304 308 326 346 373 374 387 397 407 415 ... 436
```

At this point you should have realised that in R there are multiple ways of doing
the same thing, and that this seems to happen more because of the language itself
than because somebody wanted to provide different ways of doing things. This strongly
contrasts with Python's philosophy of having one clear way of doing things (the 
Pythonic way).  

For row indexing we have the positional approach.  


```r
existing_df[1,]
```

```r
##       Afghanistan Albania Algeria American Samoa Andorra Angola Anguilla
## X1990         436      42      45             42      39    514       38
##       Antigua and Barbuda Argentina Armenia Australia Austria Azerbaijan
## X1990                  16        96      52         7      18         58
##       Bahamas Bahrain Bangladesh Barbados Belarus Belgium Belize Benin
## X1990      54     120        639        8      62      16     65   140
##       Bermuda Bhutan Bolivia Bosnia and Herzegovina Botswana Brazil
## X1990      10    924     377                    160      344    124
##       British Virgin Islands Brunei Darussalam Bulgaria Burkina Faso
## X1990                     32                91       43          179
##       Burundi Cambodia Cameroon Canada Cape Verde Cayman Islands
## X1990     288      928      188      7        449             10
##       Central African Republic Chad Chile China Colombia Comoros
## X1990                      318  251    45   327       88     188
##       Congo, Rep. Cook Islands Costa Rica Croatia Cuba Cyprus
## X1990         209            0         30     126   32     14
##       Czech Republic Cote d'Ivoire Korea, Dem. Rep. Congo, Dem. Rep.
## X1990             22           292              841              275
##       Denmark Djibouti Dominica Dominican Republic Ecuador Egypt
## X1990      12    1,485       24                183     282    48
##       El Salvador Equatorial Guinea Eritrea Estonia Ethiopia Fiji Finland
## X1990         133               169     245      50      312   68      14
##       France French Polynesia Gabon Gambia Georgia Germany Ghana Greece
## X1990     21               67   359    350      51      15   533     30
##       Grenada Guam Guatemala Guinea Guinea-Bissau Guyana Haiti Honduras
## X1990       7  103       113    241           404     39   479      141
##       Hungary Iceland India Indonesia Iran Iraq Ireland Israel Italy
## X1990      67       5   586       443   50   88      19     11    11
##       Jamaica Japan Jordan Kazakhstan Kenya Kiribati Kuwait Kyrgyzstan
## X1990      10    62     19         95   125    1,026     89         90
##       Laos Latvia Lebanon Lesotho Liberia Libyan Arab Jamahiriya Lithuania
## X1990  428     56      64     225     476                     46        64
##       Luxembourg Madagascar Malawi Malaysia Maldives Mali Malta Mauritania
## X1990         19        367    380      159      143  640    10        585
##       Mauritius Mexico Micronesia, Fed. Sts. Monaco Mongolia Montserrat
## X1990        53    101                   263      3      477         14
##       Morocco Mozambique Myanmar Namibia Nauru Nepal Netherlands
## X1990     134        287     411     650   170   629          11
##       Netherlands Antilles New Caledonia New Zealand Nicaragua Niger
## X1990                   28           112          10       145   317
##       Nigeria Niue Northern Mariana Islands Norway Oman Pakistan Palau
## X1990     282  118                      142      8   40      430    96
##       Panama Papua New Guinea Paraguay Peru Philippines Poland Portugal
## X1990     74              498       95  394         799     88       51
##       Puerto Rico Qatar Korea, Rep. Moldova Romania Russian Federation
## X1990          17    71         223     105     118                 69
##       Rwanda Saint Kitts and Nevis Saint Lucia
## X1990    190                    17          26
##       Saint Vincent and the Grenadines Samoa San Marino
## X1990                               45    36          9
##       Sao Tome and Principe Saudi Arabia Senegal Seychelles Sierra Leone
## X1990                   346           68     380        113          465
##       Singapore Slovakia Slovenia Solomon Islands Somalia South Africa
## X1990        52       55       66             625     597          769
##       Spain Sri Lanka Sudan Suriname Swaziland Sweden Switzerland
## X1990    44       109   409      109       629      5          14
##       Syrian Arab Republic Tajikistan Thailand Macedonia, FYR Timor-Leste
## X1990                   94        193      336             92         706
##       Togo Tokelau Tonga Trinidad and Tobago Tunisia Turkey Turkmenistan
## X1990  702     139    45                  17      49     83          105
##       Turks and Caicos Islands Tuvalu Uganda Ukraine United Arab Emirates
## X1990                       42    593    206      67                   47
##       United Kingdom Tanzania Virgin Islands (U.S.)
## X1990              9      215                    30
##       United States of America Uruguay Uzbekistan Vanuatu Venezuela
## X1990                        7      35        114     278        46
##       Viet Nam Wallis et Futuna West Bank and Gaza Yemen Zambia Zimbabwe
## X1990      365              126                 55   265    436      409
```

There we retrieved data for every country in 1990. We can combine this with a
column number.  


```r
existing_df[1,1]
```

```r
## X1990 
##   436 
## 17 Levels: 238 251 267 283 304 308 326 346 373 374 387 397 407 415 ... 436
```

Or its name.  


```r
existing_df$Afghanistan[1]
```

```r
## X1990 
##   436 
## 17 Levels: 238 251 267 283 304 308 326 346 373 374 387 397 407 415 ... 436
```

What did just do before? Basically we retrieved a column, that is a vector, and
accessed that vector first element. That way we got the value for Afghanistan for
the year 1990. We can do the same thing using the `[[]]` operator instead of the
list element label.  


```r
existing_df[[1]][1]
```

```r
## X1990 
##   436 
## 17 Levels: 238 251 267 283 304 308 326 346 373 374 387 397 407 415 ... 436
```

We can also select multiple columns and/or rows by passing R vectors.  


```r
existing_df[c(3,9,16),c(170,194)]
```

```r
##       Spain United Kingdom
## X1992    40             10
## X1998    30              9
## X2005    24             11
```

Finally, using names is also possible when using positional indexing.  


```r
existing_df["X1992","Spain"]
```

```r
## X1992 
##    40 
## Levels:  25  26  27  28  30  33 23 24 34 35 37 40 42 44
```

That we can combine with vectors.  


```r
existing_df[c("X1992", "X1998", "X2005"), c("Spain", "United Kingdom")]
```

```r
##       Spain United Kingdom
## X1992    40             10
## X1998    30              9
## X2005    24             11
```

##Next Steps

So enough about indexing. In the [next part of the tutorial on data frames](https://www.codementor.io/python/tutorial/python-vs-r-data-science-data-frames-ii) we will see how to perform more complex data accessing using selection.  Additionally, we will explain how to apply functions to a data frame elements, and how to group them.   

Remember that all the source code for the different parts of this series of tutorials and applications can be [checked at GitHub](https://github.com/jadianes/data-science-your-way). Feel free to get involved and share your progress with us!