Пътна карта

Въпроси
  • Как мога да манипулирам рамка с данни?

рамки

цели
  • Умейте да добавяте и премахвате редове и колони.

  • Да можете да премахвате редове със стойности на NA .

  • Да можете да добавите два кадъра с данни.

  • Умейте да формулирате какво е фактор и как да конвертирате между фактор и характер .

  • Да можете да разберете основните свойства на рамка с данни, включително размер, клас или тип колони, имена и първи редове.

Досега сте виждали основните типове R данни и структури и всичко, което правите, ще бъде манипулация на тези инструменти. Сега ще научим нещо или две относно работата с класа на рамката с данни (структурата на данните, която ще използвате през повечето време и която ще бъде звездата на шоуто). Рамката с данни е таблицата, която създаваме при зареждане на информация от csv файл.

Ключови думи

Команда: Превод

nrow: брой редове

ncol: брой колони

rbind: комбиниране на редове

cbind: комбиниране на колони

Добавяне на колони и редове към рамка с данни

Научихме, че колоните в рамка с данни са вектори. Следователно знаем, че нашите данни са в съответствие с типа данни в тази колона. Ако искаме да добавим нова колона, можем да започнем, като създадем нов вектор:

След това можем да го добавим като колона чрез:

Имайте предвид, че той ще се провали, ако се опитаме да добавим вектор с различен брой входове, отколкото броят на редовете в рамката за данни.

Защото не съм работил? Разбира се, R иска да види елемент в новата ни колона за всеки ред в таблицата:

За да работи, трябва да имаме nrow (котки) = дължина (възраст). Ще заменим съдържанието на котките с новата ни рамка за данни.

Сега, какво ще кажете за добавяне на редове, в този случай, за последен път видяхме, че редовете на рамка с данни са съставени от списъци:

Какво означава грешката, дадена от R? „Невалидно ниво на фактор“ ни казва нещо за факторите ... но какво е фактор? Факторът е тип данни в R. Фактор е категория (например цвят), с която R може да извършва определени операции. Например:

Редът на факторите също може да се пренареди.

Фактори

Обектите от факторния клас са друг тип данни, които трябва да използваме внимателно. Когато R създава фактор, той позволява само стойностите, които първоначално са били там, когато сме заредили данните. Например в нашия случай „черен“, „канела“ и „тигро“. Всяка нова категория, която не се вписва в тези категории, ще бъде отхвърлена (и ще стане NA).

Предупреждението (Warning) ни казва да добавим „костенурка“ към нашия цветен фактор. Но останалите стойности, 3.3 (от тип числови), ИСТИНА (от тип логически) и 9 (от тип числови) бяха успешно добавени към теглото, като___низа и съответно възрастта, тъй като тези стойности не са от тип фактор. За да добавим нова категория „костенурка“ към рамката с данни за котки в цветната колона, трябва изрично да добавим „костенурка“ като ново ниво (ниво) във фактора:

Като алтернатива можем да променим колоната на тип символ. В този случай губим категориите, но отсега нататък можем да добавим всяка дума в колоната, без проблеми с нивата на фактора.

Предизвикателство 1

Нека си представим, че подобно на кучетата, 1 човешка година е еквивалентна на 7 години при котките (компанията Purina използва по-сложен алгоритъм).

  1. Създайте вектор с име human.age, като умножите котките $ възраст по 7.
  2. Преобразуване на човешката възраст във фактор.
  3. Преобразувайте човешката възраст обратно в числов вектор, като използвате функцията as.numeric (). Сега разделете на 7, за да се върнете към първоначалните епохи. Обяснете какво се е случило.

Решение на предизвикателството 1

  1. човешка възраст
  2. human.age или as.factor (human.age) двете опции работят еднакво добре.
  3. as.numeric (human.age) създава 1 2 3 4 4, защото факторите се записват като цяло число обекти (1: 4), всеки от които има асоцииран етикет с етикет (28, 35, 56 и 63). Преобразуването на обект от един тип данни в друг, например от фактор в числово, ни дава целите числа, а не етикетите. Ако искаме оригиналните числа, имаме нужда от междинна стъпка, трябва да конвертираме human.age в тип символ и след това в числов (как работи това?). Това се появява в реалния живот, когато случайно включим знак в колона на нашия .csv файл, който трябваше да съдържа само числа. Ще имаме този проблем, ако при четене на файла забравим да включим stringsAsFactors = FALSE .

Премахване на редове

Сега знаем как да добавяме редове и колони към нашата рамка с данни в R, но при първия ни опит да добавим котка, наречена „костенурка“, добавихме ред, който не работи.

Можем да поискаме рамката за данни без грешен ред:

Имайте предвид, че -4 означава, че искаме да премахнем четвъртия ред, запетаята без нищо зад него показва, че се отнася за всички колони. Бихме могли да премахнем двата реда в едно обаждане, като използваме и двата номера във вектор: котки [c (-4, -5),]

Като алтернатива можем да премахнем редове, които съдържат стойности на NA:

Нека преназначим новия изходен резултат на рамката с данни за котки, така че промените ни са постоянни:

Изтриване на колони

Също така можем да изтрием колони в рамка с данни. Има два начина за изтриване на колона: по номер или име на индекс.

Забележете запетая без нищо преди нея, което показва, че искаме да запазим всички редове.

Като алтернатива можем да пуснем колоната, като използваме името на индекса.

Добавяне на редове или колони към рамка с данни

Ключът, който трябва да запомните при добавяне на данни към рамка с данни, е, че колоните са вектори или фактори, докато редовете са списъци. Можем да поставим два кадъра с данни, като използваме rbind, което означава да се присъединим към редовете (вертикално):

Но сега имената на редовете са сложни. Можем да ги премахнем и R ще ги назове отново, последователно:

Предизвикателство 2

Можете да създадете нов кадър от данни от R със следния синтаксис:

Създайте рамка за данни, която съдържа следната лична информация:

  • Име
  • фамилно име
  • любимо число

След това използвайте rbind, за да добавите запис за хората, които седят около вас. И накрая, използвайте cbind, за да добавите колона с място за всеки човек, за да отговорите на следния въпрос: "Време ли е за почивка?"

Решение на предизвикателство 2

Реалистичен пример

Досега видяхме основните манипулации, които могат да се извършват върху рамка с данни. Сега, нека разширим тези умения с по-реалистичен пример. Ще импортираме gapminder набор от данни които преди това изтеглихме:

Функцията read.table се използва за четене на таблични данни, които се съхраняват в текстов файл, където колоните с данни са разделени с пунктуационен знак, както в CSV файловете (където csv е стойности, разделени със запетая на английски, т.е. стойности, разделени със запетая).

Най-често използваните препинателни знаци, използвани за разделяне или ограничаване на данни в текстови файлове, са раздели и запетаи. За удобство R предоставя две версии на функцията read.table. Тези версии са: read.csv за файлове, където данните са разделени със запетаи и read.delim за файлове, където данните са разделени с табове. От трите варианта read.csv е най-често използваният. При необходимост е възможно да се презапишат препинателните знаци, използвани по подразбиране за двете функции: read.csv и read.delim .

Разни съвети

  • Друг тип файл, който можете да намерите, е разделеният раздел (.tsv). За да посочите този разделител, използвайте "\ t" или read.delim () .

  • Файловете могат да бъдат изтеглени от Интернет в локална папка с помощта на download.file. Функцията read.csv може да бъде изпълнена, за да прочете изтегления файл, например:

  • Като алтернатива можете да четете файловете директно в R, като използвате уеб адрес и read.csv. Важно е да се отбележи, че ако последното бъде направено, на вашия компютър няма да има локално копие на csv файла. Например,
  • Можете директно да четете електронни таблици на Excel, без да ги конвертирате в обикновен текст, използвайки пакета readxl.

Нека направим малко проучване на gapminder; Първото нещо, което винаги трябва да направите, е да видите как изглежда наборът от данни, като използвате str:

Също така можем да изследваме отделни колони на рамката с данни с функцията typeof: