Главная страница
Навигация по странице:

  • 2. Сохраните результат в новую переменную

  • 4. Пример неэффективного кода

  • 5. Упражнения «Матрицы»

  • 6. Упражнение «Арифметические операции с матрицами»

  • Практическая работа №10. Элементарная статистика

  • 3. Упражнение «Работа с датасетом»

  • Практическая работа № 11. Группировка наблюдений за загрязнением воздуха

  • Компьютерные технологии. Компьютерные технологии в экологии и природопользовании


    Скачать 8 Mb.
    НазваниеКомпьютерные технологии в экологии и природопользовании
    АнкорКомпьютерные технологии
    Дата26.01.2023
    Размер8 Mb.
    Формат файлаpdf
    Имя файлаkompyuternye-tekhnologii-v-ecologii-i-prirodopolzovanii.pdf
    ТипУчебное пособие
    #906860
    страница12 из 13
    1   ...   5   6   7   8   9   10   11   12   13

    1. Упражнение «Вектор»
    Сохраните в новой переменной вектор из 20 целых чисел с шагом 2.0.
    Выведите на экран с помощью команды print 2, 5, 7, 9 и 17 элементы вектора.
    При операциях над векторами эта операция проводится над каждым элементом вектора. Можно выполнять, например, любые арифметические операции. Также можно выполнять логические операции, например: x >= 3
    В качестве ответа будет получен вектор из FALSE и TRUE. Операции сравнения можно использовать и при индексации. Например, возьмем вектор из 20 элементов, который вы создали при выполнении упражнения. Назовем его vector_1.

    151 vector_1[vector_1>=10]
    Обратите внимание, что выводятся только те элементы, для которых это неравенство выполняется со значением TRUE. vector_1[vector_1>=10& vector_1 < 30]
    2. Сохраните результат в новую переменную
    Правила переписывания (recycling). Иногда мы работаем с векторами разной длины. Есть несколько правил работы с ними.

    Длина результата равна длине большего из векторов.

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

    Если длина большего вектора не делится нацело на длину меньшего, то выдается предупреждение (не ошибка).
    Сложим два вектора: 1:5 + 0:1. Второй вектор состоит всего из двух, поэтому появится предупреждение. Чаще всего вектором меньшей длины является скаляр
    (вектор из одного элемента). Приоритет операторов при этом сохраняется: 5:8^2;
    это не то же самое, что (5:8)^2.
    Если необходимо совершить операцию с каким-то одним элементом вектора
    (или нескольких элементов), то порядковый номер этих элементов указывается в квадратных скобках после названия вектора: f[4, 8]. Отрицательное индексирование возвращает все элементы, кроме указанных: f[-5].
    Логическое индексирование – все элементы, которые соответствуют значению TRUE:
    f[rep(c(TRUE, FALSE), 5)]
    При помощи логического индексирования удобно выбирать элементы, которые соответствуют определенным условиям.

    152 f[f<18 &f>5]
    Функция length показывает атрибут вектора (число элементов). Другие атрибуты: names, dimnames, dim и др.
    attr(x, ‘author’” <- “Caesar” – эта функция создает новый атрибут, здесь – автор.
    attributes(x) обнуляет существующие атрибуты вектора.
    Векторы можно использовать очень широко. Например, можно получить ряд последовательного возведения в степень 2 через вектор: x<-2^(0:10)
    3. Условия и циклы в R
    В R, как и в других языках программирования, широко используются разные виды условий, циклы. if – else if (“condition”) {} else {}
    condition – это выражение, результатом которого будет логический вектор длины 1 (TRUE или FALSE, NA приведет к ошибке), в фигурных скобках – произвольные команды. Обратите внимание, что нельзя переносить else на новую строку. if (sqrt(2) > 1.5) { print (“Greater!”)
    } else { print (“Less!”)
    }

    153
    Если условие необходимо проверить на целом векторе, то нужно использовать другой оператор ifelse (пишется слитно). В задаче выясняется, является ли заданный вектор (х) нестрого убывающим или нестрого возрастающим.
    В этих случаях будет напечатано слово 'TRUE', иначе – ‘FALSE’. Попробуйте самостоятельно разобраться с каждой строкой кода. Для того чтобы узнать значение функций, можно воспользоваться подсказкой в консоли: ?diff, ?prod
    is_monotone <- function(x) { b<-diff(x,1) a<-c(b>=0)*1 d<-c(b<=0)*1 y<-c(b == 0)*1 ifelse (prod(y)== 1, 'FALSE', ifelse (prod(a)== 1, 'TRUE', ifelse (prod(d) == 1, 'TRUE', 'FALSE')))
    }
    Цикл repeat. Повтор идет до того, пока не будет достигнуто пороговое значение, после чего оператор break выводит из цикла. i <- 0 repeat { i <- i+runif(1) print(i) if (I >5) break
    }
    Цикл while. Этот цикл может быть не выполнен ни разу, в отличие от repeat, который будет выполнен хотя бы один раз.

    154 i <-2^14 while (i > 1000) { i <- i/2 print (i)
    }
    Цикл for. Один из самых популярных циклов. Внутри цикла необходимо принудительно вызывать функцию print, иначе результат не будет отображен. В некоторых случаях этот вид цикла ведет к неэффективному коду. for (i in 1:8) { if (i %% 2 == 0) print (i)
    } for (i in letters) { if (i == ‘b’)next if (i == ‘d’) break print (i)
    }
    4. Пример неэффективного кода
    Многие функции в R векторизованы. Следующий код содержит лишний цикл
    for. Кроме того, не указана длина результата, поэтому результат перезаписывается время от времени.
    Задача fizz-buzz: y <- vector(mode = ‘character’, length = 100) y <- character (100) for (i in 1:100) {

    155 if (i%% 15 ==0) { y[i] <- ‘fizz buzz’
    } else if (i %% 3 == 0) { y[i] <- ‘fizz;
    } else if (i %% 5 == 0) { y[i] <- ‘buzz’
    } else { y[i] <- i
    }
    }
    Второй способ решения этой задачи (эффективный): x<- 1:100 z <- 1:100 x %% 5 x %% 5 == 0 z[x %% 5 == 0] <- ‘buzz’ z[x %% 3 == 0] <- ‘fizz’ z[x %% 15 == 0] <- ‘fizz buzz’
    Матрица – двумерный массив данных одного типа, организованных в ряды
    (row) и столбцы (col). Для создания матрицы можно воспользоваться функцией
    matrix.
    Попробуйте создать разные матрицы, варьируя условия.
    5. Упражнения «Матрицы»
    matrix (1:6, nrow = 2) matrix (1:6, nrow = 2, byrow = TRUE) matrix (5:6, nrow = 2, ncol = 5)

    156
    У матрицы есть специальный атрибут dim, который отвечает за ее размерность. m<- matrix (1:6, ncol = 3) dim(m)
    Такой же результат можно получить, запросив отдельно количество строк и столбцов в матрице: c(nrow(m), ncol(m))
    С матрицами можно проводить те же арифметические операции, что и с векторами. Их можно также индексировать.
    6. Упражнение «Арифметические операции с матрицами»
    m1<- matrix (1:4, nrow = 2) m2<- matrix (c(1, 2, 2, 3), nrow = 2) m1 m2 m1+m2 m1*2 m1*m2
    Матрицы можно присоединять друг к другу. Для этого используются команды
    rbind/cbind. Первая команда «удлиняет» матрицу, так как присоединение идет по рядам, число столбцов не изменяется. Во втором случае матрица «расширяется», а число рядов остается прежним. С помощью этих команд можно объединять любое количество матриц и векторов.

    157
    При индексации необходимо учитывать две размерности, это означает, что каждый элемент имеет два индекса, которые обозначают столбец и ряд. Если использовать только один индекс, то выделится весь столбец или весь ряд: m<-matrix (1:10, ncol= 5) m[1, 3] m[1, ] m[ ,3]
    Иногда необходимо применить какую-либо функцию не ко всей матрице, а только к определенным столбцам или строкам. Для этого используется функция
    apply. Она имеет три аргумента: матрица, индекс (1 – построчно, 2 – по столбцам) или функция. f<- function(x) sum(x^2) apply(m,1,f)
    Последнее выражение означает, что функция применяется к матрице m, построчно, f – название используемой фукнции. В упражнении используется матрица m, которая была задана ранее. apply(m,1,f)
    7. Датафреймы
    Самый важный тип данных, с которым работает R, – это таблицы данных или датафреймы (data frame). Датафрейм представляет собой одномерный список из векторов одинаковой длины. Таким образом, каждый датафрейм состоит из списка столбцов, причем внутри одного столбца все данные должны быть одного типа, а вот столбцы уже могут отличаться друг от друга. Столбцы соответствуют

    158 переменным, а строки – наблюдениям. Для наглядности попробуем самостоятельно создать датафрейм.
    Допустим, мы можем создать три вектора, описывающие присутствующих в этой аудитории: age<- с(введем сюда цифры, обозначающие возраст студентов)
    gender<-с (введем сюда обозначение пола: F или М)
    name<- c(введем сюда имена, обязательно в кавычках: “Olga”)
    data<- list(age, gender, name) data[[1]][1] data[[2]][3] df <- data.frame(Name = name, Age = age, Gender = gender) typeof(df)
    Команда покажет, что df – это list, т. е. список данных.
    Мы можем делать в R статистическую обработку данных.
    Практическая работа №10. Элементарная статистика
    В векторе age отберите только те наблюдения, которые отклоняются от среднего не больше, чем на одно стандартное отклонение. Сохраните эти наблюдения в новую переменную и напечатайте ее при помощи команды print.
    Функции:
    mean(x) – среднее значение вектора х
    sd(d) – стандартное отклонение вектора х
    abs(n) – абсолютное значение числа n
    1. Загрузка данных в R
    Можно не только работать с созданными самостоятельно в R датафреймами, но и использовать уже готовые данные. Доступ к ним можно получить с помощью команды загрузки данных (даны в форме справки, впереди знак вопроса):

    159
    ?read.table – эта функция имеет много аргументов, на описании которых необходимо остановиться.
    Аргументы: file – это название файла с данными; header – позволяет указать, является ли верхняя строка всех столбцов названием (тогда указать значение TRUE, по умолчанию – FALSE); sep – указывает, каким знаком разделены столбцы в данных, dec – каким знаком разделены десятичные дроби. Последние два аргумента принципиально важны, если вы работаете с файлами .csv, созданными в англоязычных и русскоязычных версиях Exel. По умолчанию в R sep имеет значение «,», а dec – «.». Разделение столбцов в русскоязычных версиях осуществляется с помощью точки с запятой, разделение десятичных дробей – запятыми.
    ?read.csv – аналогичная функция, но с другими значениями по умолчанию.
    Чтобы функция сработала, убедитесь, что
     указано расширение загружаемого файла,
     название файла взято в кавычки,
     загружаемый файл находится в рабочей директории.
    Если файл находится не в рабочей директории, есть три способа решить эту проблему:
     изменить рабочую директорию (в RStudio: Session -> Set Working
    Directory -> Choose Directory...);
     переместить файл в актуальную рабочую директорию;
     указать полный путь к файлу. Например: read.csv("C:/Users/username/documents/myexp.csv") read.csv('C:/R/myexp.csv') mydata<-read.csv('C:/R/myexp.csv') mydata head(mydata)

    160
    (Обратите внимание, что путь к файлу на вашем компьютере может быть другим!). Если выполнить команду mydata, то мы получим просто массив данных, которые трудно будет воспринимать визуально. Если выполнить команду
    head(mydata), то в верхней части появятся заголовки столбцов по 6 строк
    (повторяться может несколько раз).
    Можно посмотреть только названия переменных: names(mydata).
    Есть другие способы, которые позволяют посмотреть эти данные.
    View(mydata)
    В консоли появится дополнительная вкладка, где данные будут представлены в виде таблицы. Команда выводит до 1000 наблюдений.
    str(mydata) – позволяет увидеть тип переменных. Все данные, которые записываются буквами, относятся в формате csv к типу переменных Factor.
    summary(mydata) – делает элементарный стат. анализ.
    К формату csv можно привести данные других форматов, чаще всего это делают для таблиц Exel. Можно использовать и формат .txt. Отличия будут в команде, которая пишется для загрузки этого файла в среду R. Создадим файлы myexp.txt и myexp.csv прямо в программе Excel. Для этого необходимо проделать следующее:

    Нажать на вкладку Файл в левом верхнем углу.

    Выбрать Экспорт и найти опцию Изменить тип файла.

    Кликнуть на нее (появится список различных форматов).

    Выбрать .txt (разделитель — знак табуляцией ‘tab’) или .csv
    (разделитель запятая).

    Прописать расположение и имя файла.
    Теперь необходимо лишь импортировать полученные файлы в среду R. Для этого воспользуемся командами:

    161 для .csv: mydata1 <- read.csv("C:/Users/username/documents/myexp.csv", sep = ";") для .txt:
    >mydata2 <- read.table("C:/Users/username/documents/myexp.csv", sep = "\t")
    Сейчас для загрузки файлов в форматах программы Excel (.xsl или .xlsx) существует R-пакет "xlsx", который позволяет загружать их без предварительного преобразования.
    Сначала необходимо загрузить пакет "xlsx" в среду R: install.packages("xlsx", dep = T) и подключить этот пакет при помощи команды library("xlsx")
    Для загрузки таблицы необходимо прописать путь и имя файла с указанием номера листа, в котором находится таблица: имя таблицы в R <- read.xlsx("путь к файлу/имя файла.xlsx", sheetIndex =
    "номер листа")
    В нашем случае имя файла "myexp.xlsx", а имя таблицы данных в среде R –
    "mydata3": mydata3 <- read.xlsx("C:/Users/username/documents/myexp.xlsx", sheetIndex = 1)

    162
    Обратите внимание, что таблицы Exel, с которыми планируется работать дальше в среде R, должны быть приведены к единой размерности, четко структурированы и, желательно, содержать всю информацию на латинице.
    2. Анализ датафрейма
    С датафреймом можно проделывать практически все операции, которые мы учились делать с векторами и матрицами. Во-первых, поскольку датафрейм является списком, к нему применимы методы индексации списков. Кроме того, его можно индексировать как двумерную матрицу. Если сейчас вернуться к тому датафрейму, который мы только что сделали, и перейти во вкладку df в левом верхнем углу, то увидим таблицу, куда внесены все данные.
    mydata$score – выбирает отдельную переменную по имени. Значения каждой переменной представляют собой вектор. b<-mydata$score mean(b) summary(b) mydata$score*2 и т. д.
    Можно добавить в датафрейм новые переменные, например: mydata$new_varible<-0 (вместо 0 может быть что угодно, любой вектор).
    Индексирование: mydata[1,1] mydata[5,] mydata[c(2, 193, 225), 1] mydata[ ,2:5]

    163
    Таким образом, можно обращаться к любому количеству, к любым элементам таблицы, опираясь на принципы индексации, рассмотренные для векторов и матриц.
    Можно выделять отдельными таблицами часть большого датафрейма. Для этого подходит команда subset: mydata2<- subset(mydata, gender == ‘female’) mydata3<- subset(mydata, gender == ‘male’)
    Здесь будут работать также команды rbind и cbind, которые позволяют объединять датафреймы: mydata4<- rbind(mydata2, mydata3)
    Еще один источник данных, с которыми можно работать, – это библиотека datasets, которая загружается автоматически. Чтобы просмотреть весь список доступных датасетов, выполните команду library(help = "datasets"). Некоторые из этих датасетов мы будем использовать, они доступны по имени в любой момент работы. Например, если вы захотите использовать датасет mtcars, можете просто выполнить команду mtcars, чтобы увидеть данные в консоли.
    Команда data(mtcars) добавит датасет в рабочую среду.
    Команда help(mtcars) выведет информацию о датасете.
    Команда my_data <- mtcars запишет датасет в новую переменную.
    3. Упражнение «Работа с датасетом»
    В переменной df сохранены данные mtcars. В датафрейме df создайте новую переменную под названием even_gear, в которой будут единицы, если значение переменной (gear) четное, и нули, если количество нечетное.
    Напечатайте эту переменную при помощи команды print(df$even_gear)
    Вам может помочь оператор деления с остатком:

    164 5 %% 2 == 1
    TRUE
    В переменной df сохранены данные mtcars. Создайте новую переменную new_var в данных, которая содержит единицы в строчках, если в машине не меньше четырёх карбюраторов (переменная carb) или больше шести цилиндров
    (переменная cyl). В строчках, в которых условие не выполняется, должны стоять нули.
    Напечатайте переменную при помощи команды: print(df$new_var)
    Практическая работа № 11.
    Группировка наблюдений за загрязнением воздуха
    В переменную df сохранены встроенные данные airquality. В новую переменную сохраните subset исходных данных, оставив наблюдения только для месяцев 7, 8 и 9.
    При помощи функции aggregate рассчитайте количество наблюдений (не пропущенных) по переменной Ozone в каждом месяце. Для определения количества наблюдений используйте функцию length( ). Воспользуйтесь записью с помощью формулы, при которой пропущенные значения не учитываются:
    aggregate(y

    x + z , data, FUN)
    Подсказка:
    > x <- 5
    > x %in% c(3, 4, 5)
    [1] TRUE
    aggregate – позволяет применить функцию к определенной группе значений.
    aggregate (x = df$hp, by = list(df$vs), FUN = mean) – df$hp разбита на две
    группы по значениям vs и в группах рассчитано среднее.

    165
    Colnames( ) – показывает названия столбцов датафрейма.
    Можно присвоить этой функции новые значения через вектор:
    aggregate(hpvs, df, mean) aggregate(hpvs+am, df, mean) aggregate(x = df$hp, by= list(df$vs, df$am), FUN = mean) aggregate (x =df[,-c(8,9)], by = list(df$am), FUN = median) aggregate(df[,c(1,2)], by = list(df$am, df$vs), FUN = sd) aggregate(cbind(mpg, disp) am+vs, df, sd)
    is.na – игнорирует пропущенные значения,
    na.rm – исключает пропущенные значения (na.rm = T).
    В
    ИЗУАЛИЗАЦИЯ ДАННЫХ В
    R
    Для представления результатов данных в статьях или презентациях необходима их визуализация в виде таблиц или графиков, гистограмм. R позволяет строить графики и гистограммы любой сложности. Элементарная графика возможна с помощью автоматически установленных пакетов, для более сложных манипуляций потребуется скачать и установить новые пакеты, например, ggplot2,
    GrapheR, ggraph и др.
    Базовые графики и гистограммы можно построить, используя команды:
    barplot, boxplot, plot, hist, pie.
    Рассмотрим подробнее некоторые из этих функций. Pie строит круговую диаграмму. Характеристики этой диаграммы можно задать в скобках, варьируя значения аргументов. В примере указаны значения аргументов по умолчанию, их можно вообще не прописывать в функции, если вы не хотите изменить их значения.

    166
    pie(x, labels = names(x), radius = 0.8, clockwise = FALSE, init.angle = if(clockwise) 90 else 0, density = NULL, angle = 45, col = NULL, border = NULL, lty –
    NULL, main = NULL),
    labels – подписи осей,
    radius – размер диаграммы,
    clockwise – размещение по часовой стрелке или против,
    сol –цвет,
    main – название диаграммы.
    1   ...   5   6   7   8   9   10   11   12   13


    написать администратору сайта