Typy danych w R z przykładem

⚡ Inteligentne podsumowanie

Typy danych w R definiują sposób przechowywania wartości w pamięci, a operatory decydują o tym, co R może z nimi zrobić. W tym artykule omówiono wektory, zmienne, operatory arytmetyczne, relacyjne, logiczne i przypisania wraz z przykładami do uruchomienia.

  • 🔘 Atomtypy układów scalonych: R przechowuje wszystkie wartości jako wartości logiczne, całkowite, zmiennoprzecinkowe, zespolone, znakowe i surowe.
  • Sprawdzanie typu: class(), typeof() i mode() opisują wartość z trzech różnych punktów widzenia.
  • Wektory: Funkcja c() tworzy jednowymiarową kolekcję, w której każdy element ma jeden wspólny typ.
  • 🧪 Operatory: Operatory arytmetyczne, relacyjne, logiczne i przypisania pokrywają niemal każde podstawowe wyrażenie języka R.
  • 🛠️. Podzbiór: Nawiasy kwadratowe w połączeniu z warunkiem logicznym filtrują elementy wektora w jednym wierszu.
  • ⚠️ Uwaga dotycząca wersji: Wersja R 4.3.0 powodowała, że ​​argument o długości większej niż jeden w && lub || powodował błąd.

Typy danych w R

Jakie są typy danych w R?

Poniżej przedstawiono typy danych i struktury danych w programowaniu R:

Ta lista łączy dwa powiązane ze sobą pomysły, a ich rozdzielenie ułatwia zrozumienie reszty tej strony. typ danych opisuje, czym jest pojedyncza wartość — liczbą, fragmentem tekstu, PRAWDĄ lub FAŁSZEM. struktura danych Opisuje, ile wartości jest przechowywanych razem i jaki mają kształt. Skalary, wektory, macierze, ramki danych i listy to struktury; wartości w nich zawarte nadal należą do jednego z podstawowych typów R.

Structure Wymiary Czy dopuszczalne są typy mieszane? Typowe zastosowanie
Skalarny Wektor o długości 1 Nie Pojedynczy pomiar lub flaga
wektor 1 Nie Kolumna odczytów jednego typu
Matrix 2 Nie Siatki numeryczne i algebra liniowa
Ramka danych 2 Tak, jeden typ na kolumnę Zestawy danych tabelarycznych
Lista 1, ale gniazdowalne Tak, cokolwiek na element Wyniki modelu i mieszane kontenery

R nie ma oddzielnego typu skalarnego: skalar to po prostu wektor o długości jeden, dlatego tak dużo kodu R jest pisane dla całych wektorów na raz.

Podstawowe typy danych w R

Każda wartość w R należy do jednego z małego zestawu podstawowych (atomowych) typów:

  • 4.5 jest wartością dziesiętną zwaną liczbą.
  • 4 wygląda jak liczba całkowita, ale R nadal przechowuje ją jako liczbę zmiennoprzecinkową. Wpisz 4L, gdy wymagana jest prawdziwa liczba całkowita.
  • PRAWDA lub FAŁSZ to wartość logiczna, nazywana w języku R wartością logiczną.
  • Wartość wewnątrz „” lub „” to tekst (ciąg znaków). Te wartości nazywane są znakami.

Dwa kolejne typy uzupełniają zestaw. Wartości zespolone, takie jak 3+2i, zawierają część rzeczywistą i urojoną, a wartości surowe zawierają bajty. Oba typy rzadko pojawiają się w codziennej analizie, ale są wymienione w bazie R. dokumentacja typeof() obok czterech powszechnych typów.

Typ Przykładowa wartość class() zwraca typeof() zwraca
logiczny TRUE logiczny logiczny
Liczba całkowita 4L liczba całkowita liczba całkowita
Double (numeryczny) 4.5 numeryczna Podwójna
Postać „R jest fantastyczne” charakter charakter
Kompleks 3+2i kompleks kompleks
Surowy jako.surowy(10) surowy surowy

Typ zmiennej możemy sprawdzić za pomocą funkcji klasy.

Przykład 1: Sprawdź zmienną liczbową

# Declare variables of different types
# Numeric
x <- 28
class(x)

Wyjście:

## [1] "numeric"

Przykład 2: Sprawdź zmienną znakową

# String
y <- "R is Fantastic"
class(y)

Wyjście:

## [1] "character"

Przykład 3: Sprawdź zmienną logiczną

# Boolean
z <- TRUE
class(z)

Wyjście:

## [1] "logical"

Zauważ, że class() odpowiada „numeric” dla 28, mimo że 28 nie ma części dziesiętnej. R zapisał to jako wartość typu double i tylko typeof() to ujawnia. Kolejną różnicą wartą poznania jest sposób, w jaki te wartości otrzymują nazwy.

Zmienne w R

Zmienne są jednym z podstawowych elementów składowych języka R, które przechowują wartości i mają znaczenie dla każdego, kto zajmuje się analizą danych. Zmienna w R może przechowywać liczbę, obiekt, wynik statystyczny, wektor, zbiór danych lub prognozę modelu – w zasadzie wszystko, co generuje R. Możemy później użyć tej zmiennej, po prostu wywołując jej nazwę.

Aby zadeklarować zmienną w R, musimy nadać jej nazwę. Nazwa nie może zawierać spacji. Do łączenia dwóch słów możemy użyć _.

Nazwy mogą zawierać litery, cyfry, kropki i znaki podkreślenia, ale muszą zaczynać się od litery lub kropki. Słowa kluczowe, takie jak TRUE, FALSE i NULL, nie mogą być używane jako nazwy. Aby dodać wartość do zmiennej, użyj <- lub =.

Oto składnia:

# First way to declare a variable:  use the `<-`
name_of_variable <- value
# Second way to declare a variable:  use the `=`
name_of_variable = value

W wierszu poleceń możemy wpisać następujące kody, aby zobaczyć, co się stanie:

Przykład 1: Przypisz wartość i wydrukuj ją

# Print variable x
x <- 42
x

Wyjście:

## [1] 42

Przykład 2: Deklarowanie drugiej zmiennej

y  <- 10
y

Wyjście:

## [1] 10

Przykład 3: Użycie dwóch zmiennych w jednym wyrażeniu

# We call x and y and apply a subtraction
x-y

Wyjście:

## [1] 32

Zmienna przechowująca kilka wartości tego samego typu jest wektorem, a jest to struktura, której oczekuje niemal każda funkcja języka R.

Wektory w R

Wektor to jednowymiarowa kolekcja, w której każdy element ma ten sam typ. Możemy utworzyć wektor ze wszystkimi podstawowymi typami danych R, których nauczyliśmy się wcześniej. Najprostszym sposobem utworzenia wektora w R jest użycie funkcji c().

Przykład 1: Utwórz wektor numeryczny

# Numerical
vec_num <- c(1, 10, 49)
vec_num

Wyjście:

## [1]  1 10 49

Przykład 2: Utwórz wektor znaków

# Character 
vec_chr <- c("a", "b", "c")
vec_chr

Wyjście:

## [1] "a" "b" "c"

Przykład 3: Utwórz wektor logiczny

# Boolean 
vec_bool <-  c(TRUE, FALSE, TRUE)
vec_bool

Wyjście:

##[1] TRUE FALSE TRUE

Jeśli c() otrzyma mieszankę typów, nie zawodzi. Po cichu wymusza każdy element aż do najogólniejszego z dostępnych typów, więc c(1, "a", TRUE) staje się wektorem znaków. W R możemy również wykonywać obliczenia arytmetyczne na wektorach.

Przykład 4: Dodawanie dwóch wektorów element po elemencie

# Create the vectors
vect_1 <- c(1, 3, 5)
vect_2 <- c(2, 4, 6)
# Take the sum of A_vector and B_vector
sum_vect <- vect_1 + vect_2
# Print out total_vector
sum_vect

Wyjście:

[1]  3  7 11

Dodawanie działało element po elemencie, ponieważ oba wektory mają tę samą długość. Gdy długości się różnią, R przetwarza krótszy wektor, powtarzając go, aż będzie pasował do dłuższego, i ostrzega tylko wtedy, gdy dłuższa długość nie jest wielokrotnością krótszej.

Przykład 5: Pokrój pierwsze pięć elementów

W R możliwe jest pocięcie wektora. Czasami interesuje nas tylko pierwszych pięć elementów wektora. Możemy użyć polecenia [1:5], aby np.tracwartości od 1 do 5.

# Slice the first five rows of the vector
slice_vector <- c(1,2,3,4,5,6,7,8,9,10)
slice_vector[1:5]

Wyjście:

## [1] 1 2 3 4 5

Przykład 6: Tworzenie zakresu za pomocą dwukropka OperaTor

Najkrótszym sposobem utworzenia zakresu wartości jest użycie operatora dwukropka (:) między dwiema liczbami. Na przykład, korzystając z powyższego przykładu, możemy napisać c(1:10), aby utworzyć wektor wartości od jednego do dziesięciu.

# Faster way to create adjacent values
c(1:10)

Wyjście:

## [1]  1  2  3  4  5  6  7  8  9 10

Ponieważ wektor bezgłośnie zmienia typ podczas mieszania, warto wiedzieć, jak sprawdzać i konwertować typy na żądanie.

Jak sprawdzać i konwertować typy danych w R

Trzy rodziny funkcji odpowiadają na trzy stale pojawiające się pytania: czym jest to, czy to jest dany typ i czy to może stać się innym typem.

Rodzina funkcji Pytanie, na które odpowiada Przykłady
klasa(), typeof(), tryb() Jakiego typu jest ta wartość? klasa(28), typ(28), tryb(28)
Jest.*() Czy ta wartość jest typu X? jest.numeric(), jest.character(), jest.logical()
Jak.*() Czy ta wartość może stać się typem X? jako.numeric(), jako.character(), jako.integer()
str () Jak wygląda ten obiekt w całości? str(vec_num)
# Three different views of the same value
x <- 28
class(x)      # "numeric"  -- the class used for method dispatch
typeof(x)     # "double"   -- how R stores the value internally
mode(x)       # "numeric"  -- the older S-style mode

# Ask a yes/no question about a type
is.numeric(x)     # TRUE
is.character(x)   # FALSE

# Convert between types
as.character(x)   # "28"
as.integer("28")  # 28 stored as an integer
as.numeric("abc") # NA, with a coercion warning

Dwie reguły wyjaśniają większość niespodzianek. Po pierwsze, class() raportuje klasę użytą do wywołania metody, podczas gdy typeof() raportuje pamięć wewnętrzną, dlatego 28 jest „numeric” dla jednego i „double” dla drugiego. Po drugie, konwersja, która się nie powiedzie, nie zatrzymuje skryptu: as.numeric("abc") zwraca NA i wyświetla ostrzeżenie o wymuszeniu, więc ciche NA po imporcie prawie zawsze stanowią problem z typem. Ta sama logika napędza Czynniki, w których kategorie są przechowywane jako kody całkowite oraz tabela poziomów.

Po ustaleniu typów nadszedł czas na operatory, które na nich działają.

R Arytmetyka Operatorsy

Najpierw przyjrzymy się podstawowym operatorom arytmetycznym w R. Poniżej przedstawiono operatory arytmetyczne w programowaniu R i ich znaczenie:

OperaTor OPIS
+ Dodatek
- Podłożetraccja
* Mnożenie
/ podział
^ lub ** Potęgowanie
%% Modulo (reszta po dzieleniu)
%/% Dzielenie całkowite (iloraz, reszta odrzucona)

Każdy z tych operatorów jest wektorowy, co oznacza, że ​​to samo wyrażenie działa zarówno na pojedynczej wartości, jak i na całej kolumnie.

Przykład 1: Dodawanie

# An addition
3 + 4

Wyjście:

## [1] 7

Powyższy kod R można łatwo skopiować i wkleić do RStudio Konsola. W tym artykule wynik jest wyświetlany w wierszach rozpoczynających się znakiem ##. Na przykład, jeśli napiszemy kod print("Guru99") konsola drukuje [1] "Guru99", co na tej stronie byłoby pokazane jako ## [1] "Guru99 ”.

Znak ## oznacza wiersz wydruku, a liczba w nawiasie kwadratowym ([1]) jest indeksem pierwszej wartości w tym wierszu, a nie częścią wyniku.

Zdania zaczynające się od # to komentarze. Możemy użyć # w skrypcie R, aby dodać dowolną notatkę, a R zignoruje ją w czasie wykonywania.

Przykład 2: Mnożenie

# A multiplication
3*5

Wyjście:

## [1] 15

Przykład 3: Dzielenie

# A division
(5+5)/2

Wyjście:

## [1] 5

Przykład 4: Potęgowanie

# Exponentiation
2^5

Wyjście:

## [1] 32

Przykład 5: Modulo

# Modulo
28%%6

Wyjście:

## [1] 4

Arytmetyka generuje liczby. Następna grupa operatorów generuje zamiast nich wartości PRAWDA i FAŁSZ.

R Relacyjny (Porównanie) Operatorsy

Operatory relacyjne porównują dwie wartości i zwracają wynik logiczny. Są to operatory, które budują warunki używane do filtrowania i są wektoryzowane dokładnie tak samo jak operatory arytmetyczne.

OperaTor OPIS
> Lepszy niż
< Less niż
>= Większe bądź równe
<= Less niż lub równy
== Dokładnie równy
!= Nie równa się
a <- 10
b <- 3

a > b     # TRUE
a < b     # FALSE
a >= 10   # TRUE
a <= 3    # FALSE
a == b    # FALSE
a != b    # TRUE

# Relational operators are vectorised
scores <- c(45, 78, 90, 62)
scores >= 60   # FALSE TRUE TRUE TRUE

Dwa nawyki oszczędzają tu czas. Używaj == do porównania i <- do przypisania, ponieważ pojedynczy = w warunku to częsty błąd początkujących. Unikaj też == w liczbach zmiennoprzecinkowych: zaokrąglanie zmiennoprzecinkowe oznacza, że ​​0.1 + 0.2 == 0.3 to FAŁSZ, więc isTRUE(all.equal(0.1 + 0.2, 0.3)) jest bezpiecznym testem. Porównania na posortowane ramki danych Postępuj zgodnie z tymi samymi zasadami.

R Logiczne Operatorsy

Za pomocą operatorów logicznych chcemy zwracać wartości wewnątrz wektora na podstawie warunków logicznych. Poniższa tabela zawiera listę operatorów logicznych dostępnych w R.

Tabela referencyjna operatorów logicznych i relacyjnych w R wraz z ich znaczeniem

Instrukcje logiczne w R są umieszczane w nawiasach []. Możemy dodać dowolną liczbę instrukcji warunkowych, ale musimy je umieścić w nawiasach. Aby utworzyć instrukcję warunkową, możemy zastosować następującą strukturę:

variable_name[(conditional_statement)]

Zmienna nazwa_zmiennej odnosi się do zmiennej, której chcemy użyć w poleceniu, więc tworzymy polecenie logiczne, na przykład nazwa_zmiennej > 0. Na koniec używamy nawiasów kwadratowych, aby zakończyć polecenie logiczne. Poniżej znajduje się przykład polecenia logicznego.

Przykład 1: Porównanie każdego elementu wektora

# Create a vector from 1 to 10
logical_vector <- c(1:10)
logical_vector>5

Wyjście:

## [1]FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE

W powyższym wyniku R odczytuje każdą wartość i porównuje ją ze stwierdzeniem logical_vector>5. Jeśli wartość jest ściśle większa od pięciu, warunek jest PRAWDA, w przeciwnym razie FAŁSZ. R zwraca wektor PRAWDA i FAŁSZ.

Przykład 2: Zachowaj tylko pasujące elementy

W poniższym przykładzie chcemy wyeksportowaćtracTylko wartości spełniające warunek „jest ściśle większe od pięciu” można umieścić w nawiasach kwadratowych, poprzedzając je wektorem zawierającym wartości.

# Print value strictly above 5
logical_vector[(logical_vector>5)]

Wyjście:

## [1]  6  7  8  9 10

Przykład 3: Połącz dwa warunki

# Print 5 and 6
logical_vector <- c(1:10)
logical_vector[(logical_vector>4) & (logical_vector<7)]

Wyjście:

## [1] 5 6

W przykładzie 3 celowo użyto pojedynczego znaku ampersand &. Operatory jednoznakowe & i | porównują wektory element po elemencie i zwracają wektor, co jest niezbędne do tworzenia podzbiorów. Formy podwójne && i || zwracają jedną wartość i należą do warunków if() i while(). Ponieważ R 4.3.0Przekazanie argumentu dłuższego niż jeden element do && lub || jest błędem, a nie ostrzeżeniem, więc te dwie rodziny nie są już zamienne. Operator ! neguje warunek, a xor() daje wyłączne OR.

Zadanie R Operatorsy

Operatory przypisania wiążą wartość z nazwą. R oferuje ich więcej niż większość języków, a różnice mają znaczenie, gdy kod zostanie przeniesiony do Funkcje.

OperaTor OPIS
<- Zadanie lewe, wybór idiomatyczny w R
= Przypisanie lewe, ale zwykle zarezerwowane dla argumentów funkcji
-> Prawidłowe przypisanie, ważne, ale rzadko używane
<<- Superprzypisanie przeszukujące otaczające środowiska
- >> Prawe superprzypisanie
# Left assignment -- the idiomatic form
count <- 5

# Equals sign: works, but reserve it for function arguments
count = 5
round(3.14159, digits = 2)

# Right assignment
5 -> count

# Superassignment, used inside functions to reach an outer scope
count <<- 5

Przewodniki stylistyczne zalecają użycie <- do tworzenia obiektów i = do nazywania argumentów w wywołaniu, ponieważ wtedy te dwie role pozostają wizualnie odrębne. Używaj <<- oszczędnie: zmienia on obiekt poza bieżącą funkcją i utrudnia logiczne interpretowanie kodu. Gdy przypisanie i typy będą już znane, kolejne kroki to: importowanie rzeczywistych danych i reshaping to z dplyr; Przegląd języka R umieszcza cały łańcuch narzędzi w odpowiednim kontekście.

FAQ

Wektor zawiera elementy tylko jednego typu, a mieszanie typów wymusza koercję. Lista zawiera wszystko w każdym slocie, w tym inne listy, ramki danych lub funkcje, dlatego obiekty modelu są listami.

Gdy dwa wektory o różnych długościach spotykają się z operatorem, R powtarza krótszy wektor, aż długości będą się zgadzać. c(1,2,3,4) + c(1,2) daje 2 4 4 6. Ostrzeżenie pojawia się tylko wtedy, gdy dłuższa długość nie jest wielokrotnością.

NA oznacza brakującą wartość w wektorze. NULL oznacza brak obiektu i ma zerową długość. NaN to niezdefiniowany wynik liczbowy, taki jak 0/0. Inf to dzielenie przez zero, jak w 1/0.

Operator %in% sprawdza przynależność i zwraca wartość TRUE dla każdego elementu po lewej stronie znalezionego w wektorze po prawej stronie. c(2,7) %in% c(1,2,3) zwraca wartość TRUE FALSE. Zastępuje on długie łańcuchy porównań == połączone znakiem |.

Wybierz matryca dla siatek numerycznych i algebry liniowej, ramka danych dla tabel, których kolumny różnią się typem i podstęp gdy elementy mają różne kształty.

Wprowadzony w R 4.1.0, |> przekazuje wartość po swojej lewej stronie do pierwszego argumentu funkcji po swojej prawej stronie. Łączy kroki bez zagnieżdżania wywołań i nie wymaga pakietu, w przeciwieństwie do potoku magrittr %>%.

Asystenci AI sygnalizują niezgodności typów, sugerują konwersje as.* i szkicują kod przekodowania na podstawie próbki wierszy. Proponują również kroki inżynierii funkcji przed… uczenie maszynowe Model jest zamontowany. Zawsze sprawdzaj poprawność wygenerowanego kodu w stosunku do swoich danych.

Tak. Wersja RStudio 2023.09.0 i nowsze są dostarczane Drugi pilot GitHub Integracja, która uzupełnia wyrażenia R w trybie inline. Wymagana jest subskrypcja Copilot, którą administratorzy muszą włączyć na serwerze RStudio lub Posit Workbench.

Podsumuj ten post następująco: