Почему R не читает кириллицу в таблицах?
Пытаюсь импортировать таблицу .csv в R studio, выходит ошибка о содержании многобайтной строки, в общем не читает кириллицу, с таблицами где латинские символы — все нормально, собственно как фиксить?
- Вопрос задан более трёх лет назад
- 4832 просмотра
Комментировать
Решения вопроса 0
Ответы на вопрос 2
Илья Кашницкий @ikashnitsky
# to read cyrillic Sys.setlocale("LC_CTYPE", "russian")
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Head of Analytics Dept. at Netpeak
Попробуй использовать агрумент `encoding`, и указать в нём кодировку файла из которого данные читаешь.
read.csv("http://home.ustc.edu.cn/~lanrr/data.csv", encoding = "UTF-8") read.csv("http://home.ustc.edu.cn/~lanrr/data.csv", encoding = "1251")
Ответ написан более трёх лет назад
Нравится 1 1 комментарий
Спасибо, помогло с encoding = «UTF-8»
Когда переводишь таблицу из xlsx в csv (данный этап происходит в Экселе при сохранении файла), нужно выбрать вариант CSV UTR-8. Только тогда код read.csv(«home.ustc.edu.cn/~lanrr/data.csv», encoding = «UTF-8») будет работать
Ваш ответ на вопрос
Войдите, чтобы написать ответ
- Проектирование баз данных
- +1 ещё
Как спроектировать базу данных для мультиязычного сайта?
- 1 подписчик
- 16 февр.
- 52 просмотра
Как изменить кодировку символов файла.R в RStudio?
Я хочу сохранить все.R файлы в одном типе кодировки, неудобно переключать кодировки каждый раз, когда я открываю файл, поэтому, как изменить символьную кодировку.R файла в RStudio?
Поделиться Источник 05 февраля 2014 в 13:52
3 ответа
R 3.4.3; RStudio 1.1.383
Инструменты > Глобальные параметры > Код > Сохранение > «Кодировка текста по умолчанию» [Изменить]
Поделиться 13 января 2018 в 16:51
Вы можете попробовать это. Перейдите в меню «Файл» и затем «Сохранить с кодировкой. «
Поделиться 05 февраля 2014 в 14:03
Инструменты — Варианты — Общие — Кодировка текста по умолчанию:
Saved searches
Use saved searches to filter your results more quickly
Cancel Create saved search
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Проблема с кодировкой #2
kulchitsky opened this issue Feb 2, 2015 · 3 comments
Проблема с кодировкой #2
kulchitsky opened this issue Feb 2, 2015 · 3 comments
Comments
Contributor
kulchitsky commented Feb 2, 2015
Постановка проблемы
При использовании кириллицы не компилируется tikz-изображение из-за ошибки с конвертацией кодировок.
Особенности и возможное решение
По адресу tempdir() генерируется файл tikzStringWidthCalc.tex . В Windows этот файл кодируется кодировкой CP1251, при этом считывается он с использованием UTF-8. За счет этого возникает ошибка, которую нам выдает RStudio.
Скорее всего, необходимо форкнуть репозиторий tikzdevice, залезть в файл с кодом latexStrWidth.R , добавить конвертацию.
И потом исправлять следующую ошибку, так как этот файл выполняет лишь часть работы.
UPD.
Осталось только перекодировать итоговый файл иллюстрации в UTF-8.
UPD2.
У меня такая проблема: необходимо изменить кодировку итогового файла, вызвав функцию из R, но это, судя по всему, необходимо делать в C-коде, с которым я пока не до конца разобрался.
The text was updated successfully, but these errors were encountered:
Contributor Author
kulchitsky commented Feb 2, 2015
Конвертация работает! (Я, правда, сделал самым кривым способом, но это не так важно)
if (Sys.getlocale("LC_CTYPE")=="Russian_Russia.1251") < texIn scan(texFile,what=character(),encoding="CP1251",sep="\n") write.table(texIn,file=texFile,fileEncoding="UTF-8",row.names=FALSE,col.names=FALSE,quote=FALSE) >
В upd2 прошла бы эта же функция, проблема в последовательности:
Нам нужно, чтобы tikzdevice закрыл файл, и после этого уже перекодировать итоговый документ. На самом деле, у нас уже есть корректный tex-файл, только он закодирован CP1251, и надо его перекодировать.
Вопрос: когда?
Я искал точку выхода из C-файла, потому что, судя по всему, она не в R-коде.
Хотя второе было бы логичнее: ведь сигнал dev.off() должен отправляться r-программе.
Нужно почитать о том, как устроено взаимодействие графических интерфейсов и самого R.
Решение
В общем, все, я сделал коммит в мой форк по решению проблемы tikzdevice.
Но, кроме этого, возникает проблема Error in createLockFile(lockname) : cannot create lock file .
Она исправлена в брэнче next пакета filehash.
А значит.
- Для начала можно проверить на разных файлах работоспособность пакета.
- Потом можно в код tikzsetup вписать установку пакета tikzsetup-бис из гитхаба и установку пакета filehash, тоже с гитхаба, но с брэнчем next. Я попробую, наверное, до вечера написать 🙂
- Немного иначе
- А в идеале сделать пулл реквест в tikzdevice и issue в filehash, чтобы они перевели next-брэнч в master.
И еще, наверное, потом надо дать совет текстовый, чтобы изначально все строили обычные графики, и только финальную версию собирали через tikz, потому что графики все-таки существенно дольше строятся (или это при первом прогоне?).
волов.
Мне пришлось закомментировать линии, касающиеся babel, в пакете tikzsetup.
Так как option clash.
Загружаем, устанавливаем…
Онлайн IDE для R — на тот случай, если у вас не установлен R:
- https://rstudio.cloud
- Создайте папку, где будут храниться ВСЕ материалы курса. Например: Мы будем ее называть рабочей директорией. В эту папку помещайте ВСЕ файлы с кодом (с расширением .R).
- Внутри папки linmodr создайте папку data , где будут храниться все файлы с данными для анализа.
В итоге у вас должно получиться примерно это:
C:\linmodr\ C:\linmodr\data\
Настройка RStudio
Все настройки RStudio находятся в меню Tools -> Global Options
- Восстановление рабочего пространства из прошлого сеанса — это лучше отменить, т.к. обычно переменные-призраки очень мешают. На вкладке General убираем галочку Restore .RData into workspace at startup , и меняем Save workspace to .RData on exit — Never
- Перенос длинных строк в окне кода — это удобно. На вкладке Code ставим галочку рядом с опцией Soft-wrap R source files
Комментарии
Комментарии в текстах программ обозначаются символом #
# это комментарии, они не будут выполняться
Полезные клавиатурные сокращения в RStudio
- Ctrl + Shift + C — закомментировать/раскомментировать выделенный фрагмент кода
- Ctrl + Enter — отправляет активную строку из текстового редактора в консоль, а если выделить несколько строк, то будет выполнен этот фрагмент кода.
- Tab или Ctrl + Space — нажмите после того как начали набирать название функции или переменной, и появится список автоподстановки. Это помогает печатать код быстро и с меньшим количеством ошибок.
Как получить помощь
- В RStudio можно поставить курсор на слово setwd и нажать F1
- Перед названием функции можно напечатать знак вопроса и выполнить эту строку ?setwd
- Можно воспользоваться функцией help()
help("setwd")
R как калькулятор, математические операции
1024/2
## [1] 512
## [1] 1 2 3 4 5 6 7 8 9 10
## [1] 136
## [1] 16
sqrt(27)
## [1] 5.196152
Переменные
Переменные — это такие контейнеры, в которые можно положить разные данные и даже функции.
Имена переменных могут содержать латинские буквы обоих регистров, символы точки . и подчеркивания _ , а так же цифры. Имена переменных должны начинаться с латинских букв. Создавайте понятные и “говорящие” имена переменных.
var_1 1024 / 2 1238 * 3 -> var_2 var_2
## [1] 3714
Как выбрать название переменной?
- a — плохо, и даже b , с , или х . Но в некоторых случаях допустимо:)
- var1 — плохо, но уже лучше
- var_1 — плохо, но уже лучше
- shelllength — говорящее, но плохо читается
- shell_length , wing_colour или leg_num — хорошие говорящие и читабельные названия
Векторы — одномерные структуры данных
Данные в R можно хранить в виде разных объектов.
В результате выполнения следующих команд числа. Одно выражение — одно значение.
## [1] 23
sqrt(25)
На самом деле, эти величины — просто векторы единичной длины
Векторы — один объект, внутри которого несколько значений.
Некоторые способы создания векторов:
- Оператор: используется для создания целочисленных векторов, где значения следуют одно за другим без пропусков
1:10 # от одного до 10
## [1] 1 2 3 4 5 6 7 8 9 10
-5:3 # от -5 до 3
## [1] -5 -4 -3 -2 -1 0 1 2 3
- Функция seq() создает последовательности из чисел
seq(from = 1, to = 5, by = 0.5)
## [1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
- Функция c() — от англ. concatenate. Следите, чтобы было английское си, а не русское эс:).
?c # посмотрите хелп к функции
Функция c принимает несколько (произвольное количество) аргументов, разделенных запятыми. Она собирает из них вектор.
c(2, 4, 6)
## [1] 2 4 6
c(-9.3, 0, 2.17, 21.3)
## [1] -9.30 0.00 2.17 21.30
Векторы можно хранить в переменных для последующего использования
vect_num -11:12 # численный вектор от -11 до 12 сохранен в переменной vect_num vect_num_1 c(1.3, 1.7, 1.2, 0.9, 1.6, 1.4) # численный вектор, сохранен в переменной vect_num_1
Адресация внутри векторов
При помощи оператора [] , можно обратится к некоторым элементам вектора. В квадратных скобках вам нужно указать один или несколько порядковых номеров элементов
vect_num[1] # первый элемент в векторе vect_num
## [1] -11
vect_num[10] # 10-й элемент
vect_num[22]
## [1] 10
Если вам нужно несколько элементов, то их нужно передать квадратным скобкам в виде вектора. Например, нам нужны элементы с 3 по 5. Вот вектор, который содержит значения 3, 4 и 5.
## [1] 3 4 5
Если мы его напишем в квадратных скобках, то добудем элементы с такими порядковыми номерами
vect_num[3:5]
## [1] -9 -8 -7
Аналогично, если вам нужны элементы не подряд, то передайте вектор с номерами элементов, который вы создали при помощи функции c() c(2, 4, 6) # это вектор содержащий 2, 4 и 6, поэтому
vect_num[c(2, 4, 6)] # возвращает 2-й, 4-й и 6-й элементы
## [1] -10 -8 -6
vect_num[c(1, 10, 20)] # возвращает 1-й, 10-й и 20-й элементы
## [1] -11 -2 8
Вектор — одномерный объект. У его элементов только один порядковый номер (индекс). Поэтому при обращении к элементам вектора нужно указывать только одно число или один вектор с адресами.
vect_num[c(1, 2, 5)] # возвращает 1-й, 3-й и 5-й элементы
## [1] -11 -10 -7
Но R выдаст ошибку, если при обращении к вектору, вы не создавали вектор, а просто перечислили номера элементов через запятую.
vect_num[1, 3, 5] # ошибка vect_num[15, 9, 1] # ошибка
vect_num[c(15, 9, 1)] # правильно
## [1] 3 -3 -11
При помощи функции c() можно объединять несколько векторов в один вектор
c(1, 1, 5:9)
## [1] 1 1 5 6 7 8 9
c(vect_num, vect_num)
## [1] -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 ## [20] 8 9 10 11 12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 ## [39] 3 4 5 6 7 8 9 10 11 12
c(100, vect_num)
## [1] 100 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 ## [20] 7 8 9 10 11 12
Добываем 1, 3, 5 и с 22 по 24 элементы
vect_num[c(1, 3, 5, 22:24)]
## [1] -11 -9 -7 10 11 12
Типы данных в R
Числовые данные
Уже видели в прошлом разделе.
Текстовые данные
Каждый текстовый элемент (говорят “строка” — string или character) должен быть окружен кавычками — двойными или одинарными.
"это текст"
## [1] "это текст"
'это тоже текст'
## [1] "это тоже текст"
Текстовые значения можно объединять в вектора.
Это текстовый вектор
rainbow c("red", "orange", "yellow", "green", "blue", "violet") rainbow # весь вектор
## [1] "red" "orange" "yellow" "green" "blue" "violet"
Добываем первый и последний элементы
В данном случае я точно знаю, что их 6, мне нужны 1 и 6.
rainbow[c(1, 6)]
## [1] "red" "violet"
Добываем элементы с 3 по 6
Если у вас вдруг слишком короткий вектор в этом задании, то можно склеить новый из двух
double_rainbow c(rainbow, rainbow) double_rainbow
## [1] "red" "orange" "yellow" "green" "blue" "violet" "red" "orange" ## [9] "yellow" "green" "blue" "violet"
rainbow[3:6] # элементы с 3 по 6
## [1] "yellow" "green" "blue" "violet"
Логические данные
TRUE # истина
## [1] TRUE
FALSE # ложь
## [1] FALSE
Для ленивых — можно сокращать первыми заглавными буквами. Но лучше так не делать, чтобы читать программы было легче.
c(T, T, T, T, F, F, T, T)
## [1] TRUE TRUE TRUE TRUE FALSE FALSE TRUE TRUE
c(TRUE, TRUE, TRUE, FALSE, FALSE, TRUE)
## [1] TRUE TRUE TRUE FALSE FALSE TRUE
Еще логический вектор
short_logical_vector c(FALSE, TRUE)
Создаем длинный логический вектор.
Чтобы создавать длинные вектора из повторяющихся элементов, можно использовать функцию rep()
rep(x = 1, times = 3) # 1 повторяется 3 раза
## [1] 1 1 1
rep(x = "red", times = 5) # "red" повторяется 5 раз
## [1] "red" "red" "red" "red" "red"
rep(x = TRUE, times = 2) # TRUE повторяется 2 раза
## [1] TRUE TRUE
В R названия аргументов функций можно не указывать, если вы используете аргументы в том же порядке, что прописан в help к этой функции.
rep(TRUE, 5) # TRUE повторяется 5 раз, аргументы без названий
## [1] TRUE TRUE TRUE TRUE TRUE
Создаем логический вектор, где TRUE повторяется 3 раза, FALSE 3 раза и TRUE 4 раза. Результат сохраняем в переменной vect_log
vect_log c(rep(TRUE, 3), rep(FALSE, 3), rep(TRUE, 4)) vect_log
## [1] TRUE TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE TRUE
Применение логических векторов для фильтрации данных
Логические векторы создаются при проверке выполнения каких либо условий, заданных при помощи логических операторов ( > , < , == , != , >= ,
Вспомните, у нас был вот такой текстовый вектор
double_rainbow
## [1] "red" "orange" "yellow" "green" "blue" "violet" "red" "orange" ## [9] "yellow" "green" "blue" "violet"
Задача 1. Допустим, мы хотим из этого вектора извлечь только желтый цвет.
Мы можем создать логический вектор, в котором TRUE будет только для 3-го и 9-го элементов
f_yellow double_rainbow == "yellow" f_yellow
## [1] FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
Этот логический вектор-фильтр мы можем использовать для извлечения данных из double_rainbow
double_rainbow[f_yellow]
## [1] "yellow" "yellow"
Задача 2. Допустим, мы хотим извлечь из double_rainbow желтый и синий Желтый фильтр у нас уже есть, поэтому мы создадим фильтр для синего.
f_blue double_rainbow == "blue"
Выражение “желтый или синий” можно записать при помощи логического “или” ( | )
f_yellow | f_blue
## [1] FALSE FALSE TRUE FALSE TRUE FALSE FALSE FALSE TRUE FALSE TRUE FALSE
Задача решена, мы извлекли желтый и синий цвета.
double_rainbow[f_yellow | f_blue]
## [1] "yellow" "blue" "yellow" "blue"
То же самое можно было бы записать короче.
В одну строку — совершенно нечитабельно:
double_rainbow[double_rainbow == "yellow" | double_rainbow == "blue"]
## [1] "yellow" "blue" "yellow" "blue"
Фильтр отдельно — читается лучше:
f_colours double_rainbow == "yellow" | double_rainbow == "blue" double_rainbow[f_colours]
## [1] "yellow" "blue" "yellow" "blue"
У нас был числовой вектор
vect_num
## [1] -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 ## [20] 8 9 10 11 12
Задача 3. Давайте извлечем из числового вектора vect_num только значения больше 0
vect_num[vect_num > 0]
## [1] 1 2 3 4 5 6 7 8 9 10 11 12
Задача 4. Давайте извлечем из вектора vect_num все числа, которые либо меньше или равны -8, либо больше или равны 8
f_5_8 (vect_num -8) | (vect_num >= 8) vect_num[f_5_8]
## [1] -11 -10 -9 -8 8 9 10 11 12
Факторы
Факторы — это способ хранения дискретных (=категориальных данных). Например, если вы поймали 10 улиток и посмотрели их цвет. У большого количества улиток небольшое счетное количество возможных цветов.
snail_colours c("red", "green", "green", "green", "yellow", "yellow", "yellow", "yellow") snail_colours # это текстовый вектор.
## [1] "red" "green" "green" "green" "yellow" "yellow" "yellow" "yellow"
Но цвет “желтый” обозначает одно и то же для каждой из улиток. Поэтому в целях экономии места можно записать цвета этих улиток в виде вектора, в котором численным значениям будут сопоставлены “этикетки” (называются “уровни” — levels) — названия цветов. Мы можем создать “фактор” цвет улиток.
factor(snail_colours)
## [1] red green green green yellow yellow yellow yellow ## Levels: green red yellow
уровни этого фактора
- 1 — green,
- 2 — red,
- 3 — yellow
По умолчанию, R назначает порядок уровней по алфавиту. Можно изменить порядок (см. help(«factor») ). Нам это пригодится позже
double_rainbow # текстовый вектор
## [1] "red" "orange" "yellow" "green" "blue" "violet" "red" "orange" ## [9] "yellow" "green" "blue" "violet"
Создаем фактор из текстового вектора и складываем его в переменную
f_double_rainbow factor(double_rainbow)
Как узнать, что за данные хранятся в переменной?
Чтобы узнать, что за данные хранятся в переменной, используйте функцию class()
class(f_double_rainbow)
## [1] "factor"
class(vect_log)
## [1] "logical"
class(vect_num)
## [1] "integer"
class(rainbow)
## [1] "character"
Встроенные константы в R
Встроенные константы в R: NA, NULL, NAN, Inf
- NA — англ “not available”. Когда объект был, но его свойство не измерили или не записали.
- NULL — пусто — просто ничего нет
- NaN — “not a number”
- Inf — “infinity” — бесконечность
Вот текстовый вектор с пропущенным значением
rainbow_1 c("red", "orange", NA, "green", "blue", "violet")
Кстати, если попросили добыть из вектора номер элемента, которого там точно нет, то R выдаст NA, потому, что такого элемента нет
rainbow_1[198]
## [1] NA
Поэкспериментируем с векторами. Проверим, как работают арифметические операции
vect_num + 2
## [1] -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
vect_num * 2
## [1] -22 -20 -18 -16 -14 -12 -10 -8 -6 -4 -2 0 2 4 6 8 10 12 14 ## [20] 16 18 20 22 24
vect_num * (-2)
## [1] 22 20 18 16 14 12 10 8 6 4 2 0 -2 -4 -6 -8 -10 -12 -14 ## [20] -16 -18 -20 -22 -24
vect_num ^2
## [1] 121 100 81 64 49 36 25 16 9 4 1 0 1 4 9 16 25 36 49 ## [20] 64 81 100 121 144
Теперь посмотрим на встроенные константы в действии.
Создаем новый вектор для экспериментов
NAs_NANs c(1, 3, NA, 7, 0, 22:24)
Вот так он выглядит
NAs_NANs
## [1] 1 3 NA 7 0 22 23 24
Что произойдет с NA?
NAs_NANs + 2 # останется NA
## [1] 3 5 NA 9 2 24 25 26
NAs_NANs * 0 # останется NA
## [1] 0 0 NA 0 0 0 0 0
NAs_NANs / 0 # останется NA
## [1] Inf Inf NA Inf NaN Inf Inf Inf
Но в последнем случае вы увидите
- Inf при делении чисел на ноль
- NaN при делении нуля на ноль
NaN получится, если взять корень из отрицательного числа
sqrt(-1)
## Warning in sqrt(-1): NaNs produced
## [1] NaN
Функции в R
Вы уже видели массу функций, их легко узнать по скобкам после ключевого слова. Познакомимся еще с несколькими и научимся писать пользовательские функции. Пользовательские функции позволяют автоматизировать повторяющиеся действия и делают код легко читаемым.
NAs_NANs
## [1] 1 3 NA 7 0 22 23 24
Длину вектора можно вычислить при помощи функции length()
length(NAs_NANs)
Сумму элементов вектора при помощи функции sum()
sum(NAs_NANs)
## [1] NA
Упс! Почему-то получилось NA
Чтобы узнать, почему и как это исправить — посмотрите в help(«sum») . Выяснится, что у функции sum() есть аргумент na.rm , который по умолчанию принимает значение FALSE , то есть NA не учитываются при подсчете суммы.
Если мы передадим функции sum аргумент na.rm = TRUE , то получится правильная сумма
sum(NAs_NANs, na.rm = TRUE)
## [1] 80
Та же история с функцией mean
mean(NAs_NANs, na.rm = TRUE)
## [1] 11.42857
Попробуем написать пользовательскую функцию mmean() , которая будет по умолчанию считать среднее значение элементов в векторе с учетом пропущенных значений ( NA )
mmean function(x) mean(x, na.rm = TRUE) >
В этом коде: — mmean — переменная, название функции. В эту переменную мы складываем функцию, которую создает функция function() — function() — функция, которая делает функции. В скобках перечисляются аргументы (названия переменных, которые мы передаем в функцию, чтобы она что-то сделала с ними) — < >— в фигурных скобках тело функции — последовательность действий, которую нужно сделать с аргументами
У больших функций бывает еще инструкция return() , которая сообщает, что именно должна возвращать наша функция. Вот как выглядела бы наша функция с этой инструкцией
mmean function(x) res mean(x, na.rm = TRUE) return(res) >
Проверим нашу функцию при помощи встроенной функции
mean(vect_num, na.rm = TRUE)
## [1] 0.5
mmean(vect_num)
## [1] 0.5