Книга: Много цифр. Анализ больших данных при помощи Excel
Назад: 10. Переходим от таблиц к программированию
Дальше: Настоящая научная работа с данными

Налаживаем контакт с R

R можно скачать с сайта www.r-project.org. Нажмите на ссылку загрузки, выберите ближайшее зеркало и скачивайте установщик для вашей ОС.
Запустите его (в Windows лучше устанавливать программы под учетной записью администратора) и откройте приложение. В Windows и MacOS загрузится консоль R. Выглядит она примерно так, как показано на рис. 10-1.

 

 

В этой консоли после значка > печатаются команды, которые запускаются нажатием клавиши Return (Enter в Windows). Вот такие:
> print(«No regrets. Texas forever.»)
[1] «No regrets. Texas forever.»
> 355/113
[1] 3.141593
Чтобы система вывела вам текст или содержимое файла, вызывайте функцию print. Еще можно задавать ей арифметические выражения, а она будет вычислять результат. А вот моя стандартная схема работы:
• Загрузить данные в R.
• Поделать с ними разные научные штуки.
• Вытащить результаты из R, чтобы другие люди или процессы могли ими пользоваться.
Когда наступает время делать первый шаг, то есть переносить данные в R, приходится выбирать из множества вариантов. Чтобы лучше понять переменные и типы данных, начнем с введения их вручную.

Пошевелим пальцами

Самый простой способ поместить данные в R – точно такой же, как и в Excel. Введение данных вручную и запись нажатий клавиш. Можете начать с сохранения одного значения в переменной:
> almostpi <– 355/113
> almostpi
[1] 3.141593
> sqrt(almostpi)
[1] 1.772454
В этой маленькой части кода вы сохранили 355/113 в переменной под названием almostpi («почти пи» – англ.). Вбив затем переменную обратно в консоль и нажав Return/Enter, выведите на экран ее содержимое. Теперь с этой переменной можно делать множество вещей (в моем примере – извлечь квадратный корень).
Краткий справочник многих встроенных в R функций (тех, что доступны без загрузки дополнительных пакетов… они вам пригодятся позже) находится здесь: .
Чтобы понять, алгоритм действия функции, просто поставьте перед ее названием вопросительный знак в консоли:
>?sqrt
Тогда после нажатия клавиши Return/Enter появится всплывающее окно справки по функции (рис. 10-2 показывает такое окно для функции sqrt).
Можете напечатать даже перед функцией два вопросительных знака, чтобы найти какую-либо информацию, например:
??log
Поиск по слову log приводит к результатам, изображенным на рис. 10-3.
Заметка
Существует невероятное множество отличных ресурсов для поиска доступных вам в R функций или пакетов, кроме дурацкого «??». К примеру, rseek.org – отличный поисковик по всему связанному с R. Конкретные же вопросы можно задавать здесь:  ( ) или писать сюда: .
Векторная алгебра и факторинг
Числовой вектор можно вставить с помощью функции с() (с здесь означает combine – «объединять»). Запустим в переменную немного простых чисел:
> someprimes <– 0(1,2,3,5,7,11)
> someprimes
[1] 1 2 3 5 7 11

 

 

Функция Length() («длина» – англ.) поможет вам сосчитать количество элементов вектора:
> length(someprimes)
[1] 6
А квадратные скобки – обратиться к определенному элементу вектора:
> someprimes[4]
[1] 5
Мы получаем четвертый элемент вектора, которым оказывается 5. Также с помощью с() можно задать несколько элементов вектора или обозначить промежуток двоеточием:
> someprimes [с (4, 5,6)]
[1] 5 7 11
> someprimes[4:6]
[1] 5 7 11
В обоих этих случаях вы получаете элементы вектора с четвертого по шестой. Также для вызова значений можно использовать логические операторы. К примеру, если вам нужны только простые числа меньше семи, то используйте функцию which(), чтобы получить их номера в векторе:
> which(someprimes<7)
[1] 12 3 4
> someprimes[which(someprimes<7)]
[1] 12 3 5
Поместив данные в переменную, можно выполнять операции надо всем набором, а результат записать в новую переменную. К примеру, умножим все числа на 2 (times 2 – англ.):
> primestimes2 <– someprimes*2
> primestimes2
[1] 246 10 14 22
Подумайте, как бы вы это делали в Excel. Ввели бы в соответствующую ячейку формулу и раскопировали бы ее на весь столбец. R позволяет вам озаглавить этот столбец или ряд данных и оперировать им дальше как одной переменной, что гораздо удобнее.
Одна полезная функция для проверки данных на странные значения – функция summary:

 

 

И еще можно работать с текстом:
> somecolors <– с(«blue»,"red","green","blue",
«green»,"yellow","red","red")
> somecolors
[1] «blue» «red» «green» «blue» «green» «yellow»"red" «red»
Если суммировать somecolors, то вы получите только немного описательных данных:
summary(somecolors)
Length Class Mode
8 character character
Эти цвета можно рассматривать как категории и превратить этот вектор в категорийные данные, «факторизуя» их:
> somecolors <– factor(somecolors)
> somecolors
[1] blue red green blue green yellow red red
Levels: blue green red yellow
Просуммировав данные, вы получаете подсчет каждого «уровня» (уровень – это отдельная категория):

 

Двумерные матрицы
Векторы, с которыми мы забавлялись до этого, были одномерными. Есть кое-что чуть больше похожее на электронную таблицу – это матрица, двумерный массив чисел. Можно построить ее функцией matrix:

 

 

И сосчитать число столбцов и строк:
> nrow(amatrix)
[1] 2
> ncol(amatrix)
[1] 6
Если захотите транспонировать данные (как делали на протяжении всей книги с помощью опции транспонирования в меню специальной вставки) – воспользуйтесь функцией t():

 

 

Для выбора отдельных записей или промежутков используйте те же квадратные скобки, только ссылки на столбцы и строки нужно разделять запятыми:
> amatrix[1:2,3]
[1] 7 11
Здесь мы получили значения строк с 1 по 2 для столбца 3. Впрочем, особой нужды ссылаться на обе строки, 1 и 2 нет, потому что в данной матрице больше нет строк. Вместо этого можно просто не писать ничего на месте ссылки на строку – и вы получите содержимое всей строки:
> amatrix[,3]
[1] 7 11
Функции rbind() и cbind() помогут пристроить в матрице новые строки или столбцы данных:

 

 

Здесь вы создали новую строку данных (primestimes3) и использовали rbind(), чтобы приклеить ее к переменной amatrix и записать результат обратно в amatrix.
Самый лучший тип данных из всех: датафрейм (dataframe)
Датафрейм– идеальный способ работы с реальным миром, база данных, похожая на таблицу в R. Датафрейм в R – это особая версия типа данных «list». Так что же такое list? List («список», англ.) – это коллекция объектов в R, которые могут быть разного типа. К примеру, вот list правдивой информации о вашем покорном слуге:
> John<-list(gender="male", age="ancient", height = 72,
spawn = 3, spawn_ages = с(.5,2,5))
> John
$gender
[1] «male»
$age
[1] «ancient»
$height
[1] 72
$spawn
[1] 3
$spawn_ages
[1] 0.5 2.0 5.0
Датафрейм – это такой тип подобного списка, чрезвычайно похожего на таблицу Excel. В принципе это двумерная таблица, ориентированная по столбцам, которые могут считаться численными или категорийными векторами. Создать датафрейм можно, вызвав функцию data.frame() для импортированных или вбитых вручную данных. Для иллюстрации следующего примера я использовал данные из фильмов о Джеймсе Бонде. Сначала создайте несколько векторов:
> bondnames <– с(«connery»,"lazenby","moore","dalton",
«brosnan»,"craig")
> firstyear <– с(1962,1969,1973,1987,1995,2006)
> eyecolor <– с(«brown»,"brown","blue", «green», «blue», «blue»)
> womenkissed <– с(17,3,20,4,12,4)
> countofbondjamesbonds <– с(3,2,10,2,5,1)
Итак, на данном этапе у нас 5 векторов – численных и текстовых – и все одинаковой длины. Скомбинируйте их в один датафрейм под названием bonddata:

 

 

Функция dataframe позаботится о распознавании того, что в этих столбцах является фактором, а что – числом. Убедитесь в разнице, вызвав функции str() и summary():

 

 

Обратите внимание, что год считается числом. Можно факторизовать этот столбец с помощью функции factor(), если хотите считать его категорийным.
Самое прекрасное в датафреймах – то, что можно ссылаться на столбцы, используя значок $ и название столбца, как показано:

 

 

При запуске функции summary годы считаются как категорийные данные, а не числовые. Также не забывайте, что когда бы вы ни транспонировали датафрейм, результатом будет являться старая добрая двумерная матрица, а не другой датафрейм. И это, безусловно, имеет смысл – ведь в транспонированной версии данных о Бонде нет соответствующего типа данных в каждом столбце.

Чтение данных в R

Заметка
Файл CSV, использованный в этой части, WineKMC.csv, можно загрузить на сайте книги, www.wiley.com/go/datasmart.
Отлично! Мы научились складывать данные в различные типы данных вручную, но как быть с теми, что записаны в файл? Первое, что нужно усвоить – это понятие «рабочая директория». Рабочая директория – это папка, в которую вы записываете данные, чтобы консоль R могла их найти и прочитать. Функция getwd() отображает текущую рабочую директорию:
> getwd()
[1] «/Users/johnforeman/RHOME»
Если вам она не нравится, можете сменить ее командой setwd(). Помните: даже на компьютерах с Windows R считает, что директории должны быть разделены правым слэшем. К примеру,
setwd(«/Users/johnforeman/datasmartfiles»)
Используйте эту команду для установки своей рабочей директории – места, где вы будете хранить свои данные. Начните с помещения в эту директорию файла WineKMC.csv. Это файл с данными, разделенными запятыми, из вкладки Matrix книги кластеризации по k-средним из главы 2. Давайте прочитаем его.
Для чтения используйте функцию read.csv():
> winedata <– read.csv(«WineKMC.csv»)
Эти данные должны выглядеть в точности как вкладка Matrix из главы 2. Выведя на экран первые несколько столбцов (я выбрал 9, чтобы уместились на странице), вы увидите описательные данные о каждом из 32 предложений, на которые откликались покупатели. Они отражены в векторах, записанных в столбцах:

 

 

Все уместилось! Однако нельзя не заметить, что пустые ячейки в векторах (которые Excel воспринимает как 0) превратились в NA. Нужно превратить их обратно в 0 с помощью функции is.na() внутри квадратных скобок:

 

 

Бах! NA превратились в 0.
Назад: 10. Переходим от таблиц к программированию
Дальше: Настоящая научная работа с данными

БУРГЕР КИНГ
Я не робот!
Антон
Перезвоните мне пожалуйста по номеру. 8 (953) 367-35-45 Антон
Антон
Перезвоните мне пожалуйста 8 (495) 248-01-88 Антон.