(V) Instrukcja sterująca for

Instrukcja sterująca for instruuje R, aby przechodził przez sekcję kodu określoną liczbę razy. Istnieje wiele sposobów wykonania zapętlenia w oparciu o kryteria zapętlania. Kryteria zapętlenia mogą być dość elastyczne. Najprostsza forma to (i w 1: n), gdzie i jest obiektem indeksującym od 1 do n, a n jest liczbą całkowitą. Ogólnie rzecz biorąc, składnia instrukcji sterowania przepływem dla pętli for to for („zmienna indeksująca” w „obiekcie wektorowym”), gdzie zmienna indeksująca to zmienna, której wartość zmienia się przy każdej iteracji pętli, a obiekt wektorowy zawiera wartości, których wartość indeksowana trwa. Obiekt wektorowy może być dowolnym obiektem, który można przekształcić w wektor, w tym obiektami listy trybów i wyrażenia. Zmienna indeksująca obiekt będzie sekwencyjnie przyjmować wartości obiektu wektorowego. Zwykle zmienna indeksująca jest używana w instrukcjach kodu wykonywanych przez pętlę for. Zwróć uwagę, że jeśli obiekt wektorowy jest tworzony za pomocą funkcji seq() w instrukcji for i argumentu seq() wraz z. Z-który można skrócić wzdłuż-jest używany, funkcja seq () podaje indeksy elementów along.with zamiast wartości przedmiotu. Oto niektóre formy pętli for:

for (‘looping criteria’) ‘single code statement’

for (‘looping criteria’) ‘single code statement’; ‘single code statement’

for (‘looping criteria’) {‘multiple code statements separated by semicolons’}

for (‘looping criteria’) {

‘lines of code statements’

}

Ponownie, cztery formy nie wyczerpują wszystkich możliwych form. W drugiej postaci kod po średniku jest wykonywany dopiero po zakończeniu pętli for, ponieważ obie instrukcje nie są umieszczone w nawiasach. Zgodnie ze stroną pomocy CRAN dotyczącą sterowania przepływem, wartość zmiennej indeksującej można zmienić w instrukcjach kodu, do których odwołuje się for, ale na początku następnej pętli powraca do następnej indeksowanej wartości zmiennej. Na końcu pętli wartością zmiennej indeksującej jest końcowa wartość zmiennej indeksującej w pętli.

(V) Instrukcja sterująca „while”

Instrukcja while wykonuje blok kodu, gdy warunek logiczny jest prawdziwy. Ponownie, obiekt logiczny musi być obiektem, który można przekształcić w obiekt logiczny. Jeśli obiekt logiczny ma długość większą niż jeden, używany jest tylko pierwszy element obiektu. Oświadczenie kontrolne może mieć następujące formy:

while (‘logical object’) ‘single code statement’

while (‘logical object’) ‘single code statement’; ‘single code statement’

while (‘logical object’) {‘multiple code statements separated by semicolons’}

while (‘logical object’) {

‘lines of code statements’

}

Ponownie, przedstawione formularze nie wyczerpują wszystkich możliwych form. Zauważ, że w przypadku drugiej formy druga instrukcja nie jest wykonywana, dopóki pętla while nie zostanie zakończona, ponieważ obie instrukcje nie są w nawiasach.

(V) Instrukcje sterujące „if” i „if / else”

Instrukcja sterująca if przyjmuje obiekt logiczny i wykonuje kod, jeśli obiekt jest prawdziwy. Jeśli obiekt nie jest prawdziwy, to opcjonalnie wykonywany jest inny kod podany przez inną jednostkę else. Obiekt logiczny musi być obiektem, który można przekształcić w obiekt logiczny. Jeśli obiekt logiczny ma długość większą niż jeden, używany jest tylko pierwszy element obiektu. Oświadczenie if może przyjąć następujące formy:

if (‘logical object’) ‘single code statement’

if (‘logical object’) ‘single code statement’;’single code statement’

if (‘logical object’) {‘more than one code statement separated by semicolons’}

if (‘logical object’) {

‘lines of code statements’

}

Te cztery formularze nie wyczerpują wszystkich możliwych form. W drugiej formie druga instrukcja zostanie wykonana, nawet jeśli obiekt logiczny jest fałszywy, ponieważ obie instrukcje nie są zawarte w nawiasach. Jeśli obiekt logiczny ma wartość false, istnieje opcja umożliwiająca R wykonanie innego kodu przy użyciu instrukcji else. Dla dwóch instrukcji sterujących if i else mamy dwa przykłady form:

if (‘logical object’) ‘single code statement’ else ‘single code statement’

if (‘logical object’) {

‘lines of the code statements’

}

else {

‘lines of the code statements’

}

Ponownie, te dwie formy nie są wyczerpujące. Jeśli nie ma innej instrukcji sterującej, a obiekt logiczny ma wartość fałsz, instrukcje kodu następujące po instrukcji if są pomijane.

(V) Nawiasy „{}” i średnik „;”

Nawiasy klamrowe służą do umieszczania sekcji kodu. Nawiasy mogą być używane z instrukcjami sterującymi if, while, for i repeat w celu określenia sekcji kodu, na której ma działać instrukcja sterująca, zarówno w ramach funkcji, jak i w konsoli R. Nawiasów można również używać bez towarzyszącej instrukcji sterowania przepływem, bezpośrednio w konsoli R. Rozpoczynając od nawiasu otwierającego, instrukcje kodu można wprowadzać po jednym wierszu na raz. Instrukcje nie są wykonywane, dopóki nie zostanie wprowadzony nawias zamykający. Średnik służy do umieszczania więcej niż jednej instrukcji w jednym wierszu. Instrukcja nie jest oceniana, dopóki instrukcja nie zostanie zakończona. Jeśli pierwsza instrukcja jest instrukcją sterowania przepływem, po której następuje pojedyncza instrukcja kodu, przepływ sterowania musi zakończyć się przed wykonaniem drugiej instrukcji. Jeśli jednak dwie lub więcej instrukcji jest ujęta w nawias otwierający i zamykający po instrukcji sterowania przepływem, wszystkie instrukcje w nawiasach są wykonywane razem na podstawie instrukcji sterowania przepływem.

(V) Kontrola przepływu

Instrukcje sterowania przepływem służą do wielokrotnego powtarzania serii zadań lub do kierowania przepływem w oparciu o obiekt logiczny. Dla osób, które zaczęły programować w wieku FORTRAN i BASIC, używanie pętli jest bardzo wygodne. W R lepszym wyborem, jeśli to możliwe, jest użycie tablic i wyboru indeksu zamiast pętli. Korzystanie z indeksów jest znacznie szybsze niż zapętlanie. To powiedziawszy, instrukcje sterujące to if, if / else, while, for i repeat. Czasami są konieczne, a często przydatne.

(IV) Funkcja ftable()

Funkcja ftable() tworzy macierz z tabeli kontyngencji – to znaczy macierz, która jest płaską tabelą. Argumenty są to . . ., exclude, row.vars i col.vars. Argumenty . . . mogą być obiektami, które można przekształcić w wektor i które można zinterpretować jako czynniki. Argumentem może być lista, której elementy mogą być interpretowane jako czynniki, lub argument może być typu table lub ftable. Argument wyklucza podaje wartości, które mają być wykluczone podczas tworzenia płaskiej tabeli. Domyślnie wyklucz równa się c (NA, NaN). Argumenty row.vars i col.vars określają wymiary, które należy umieścić w wierszach i kolumnach. Wartości mogą sięgać od jednego do liczby wymiarów w tabeli – innymi słowy, tabela z trzema wymiarami może mieć row.vars i col.vars równe 1: 2 i 3; lub 2: 1 i 3; lub 1 i 3; lub c (3,1) i 2; i tak dalej. Oto przykład:

> a.list = list(1:2,3:4,5:6)

> ftable(a.list)

x.3 5 6

x.1 x.2

1 3 1 0

4 0 0

2 3 0 0

4 0 1

> a1 = 1:2

> a2 = 3:4

> a3 = 5:6

> ftable(a1, a2, a3, row.vars=3, col.vars=2:1)

a2 3 4

a1 1 2 1 2

a3

5 1 0 0 0

6 0 0 0 1

> a.table = table(1:2,3:4,5:6)

> ftable(a.table, row.vars=2, col.vars=3)

5 6

3 1 0

4 0 1

Więcej informacji na temat ftable() można znaleźć, wpisując ?ftable po znaku zachęty R.

(IV) Funkcja tabulate()

Funkcja tabulate() przekształca obiekty liczbowe lub czynnikowe na wektory i przedstawia wynik w tabeli. Argumentami są bin i nbins. Argument bin to obiekt do składowania. Jeśli obiekt nie jest obiektem typu integer lub factor, elementy są zaokrąglane w dół do liczb całkowitych. Wynikowe liczby całkowite muszą być dodatnie. Jeśli obecny jest niedozwolony element, element jest ignorowany. Argument nbins podaje największą liczbę całkowitą do podziału i domyślnie jest równa max (1, bin, na.rm = T) – to jest największa wartość w bin, przy założeniu, że największa wartość w bin jest większa niż jeden. Jeśli liczba nbins jest mniejsza niż największa wartość w przedziale, to tylko wartości o wartości mniejszej lub równej nbins są kategoryzowane. Wszystkie liczby całkowite od 1 do nbins są dzielone na bin, nawet jeśli w danym koszu jest zero elementów. Funkcja tworzy wektor bez etykiet. Pojemniki zawsze zaczynają się od jednego. Oto przykład:

> tabulate(c(-3.5,.9,1,4,5.6,5.4,4,1,3))

[1] 2 0 1 2 2

> tabulate(c(-3.5,.9,1,4,5.6,5.4,4,1,3), nbins=3)

[1] 2 0 1

W tym przykładzie są dwie jedynki, zero dwójek, jedna trójka, dwie czwarte i dwie piątki w zredukowanym obiekcie. Funkcja tabulate() jest dobra, gdy potrzebne są wszystkie pojemniki, w tym te z zerowymi elementami. Więcej informacji na temat funkcji tabulate () można znaleźć, wpisując ?tabulate w wierszu polecenia R.

(IV) Funkcje table(), as.table() i is.table()

Istnieją trzy funkcje związane z tworzeniem tabel za pomocą table(). Funkcja table() tworzy tabelę awaryjną z danych atomowych lub niektórych list. Dane muszą być interpretowane jako czynniki. Wynik ma tabelę klas. Funkcja as.table () próbuje przekształcić obiekt w tabelę klas. Funkcja is.table () sprawdza, czy obiekt jest typu tabela klas. Argumentami funkcji table() są . . ., exclude, useNA, dnn i deparse.level. Argument. . . odnosi się do przedmiotu (przedmiotów), które mają być klasyfikowane krzyżowo. Obiekty są oddzielone przecinkami i dla obiektów atomowych muszą mieć taką samą długość. W przypadku obiektów listy wszystkie elementy drugiego poziomu muszą mieć tę samą długość i być atomowe. W wywołaniu table() nie można łączyć obiektów atomowych i list. Argument wyklucza podaje wartości, które mają być wykluczone z tabeli kontyngencji. Domyślnie wyklucz równa się, jeśli (useNA == „no”) c (NA, NaA), co oznacza, że ​​table() nie ustawia poziomu brakujących wartości lub niedozwolonych wartości, takich jak jeden podzielony przez zero, jeśli argument useNA jest równy “Nie”. Argument useNA jest argumentem znakowym i może przyjmować wartość „nie”, „jeśli” lub „zawsze”. W przypadku „nie” brak jest ustawionych poziomów. W przypadku „ifany” poziom jest ustawiany, jeśli występują brakujące wartości. W przypadku „zawsze” zawsze ustawiany jest poziom braków danych. Poziom domyślny to „nie”. Argument dnn jest argumentem listowym i podaje nazwy wymiarów dla tabeli kontyngencji. Wartość domyślna to list.names (…). Funkcja list.names () jest zdefiniowana w tabeli () i podaje nazwy tabelarowanych wymiarów. Argument deparse.level jest argumentem w postaci liczby całkowitej, który może przyjąć wartości 0, 1 lub 2. Argument steruje list.names (), jeśli nie podano nazwy dnn. W przypadku 0 nie podaje się żadnych nazw. W przypadku 1 używane są nazwy kolumn. W przypadku 2 nazwy kolumn są eparsowane. Wartość domyślna to 1. Oto przykład:

> table(c(1,2,1,2),1:4, useNA=”always”, deparse.level=0)

1 2 3 4 <NA>

1 1 0 1 0 0

2 0 1 0 1 0

<NA> 0 0 0 0 0

> table(c(1,2,1,NA),1:4,c(5,6,6,5), useNA=”no”, deparse.level=1)

, , = 5

1 2 3 4

1 1 0 0 0

2 0 0 0 0

, , = 6

1 2 3 4

1 0 0 1 0

2 0 1 0 0

> table(c(1,2,1,NA),1:4,c(5,6,6,5), useNA=”ifany”, deparse.level=2)

, , c(5, 6, 6, 5) = 5

1:4

c(1, 2, 1, NA) 1 2 3 4

1 1 0 0 0

2 0 0 0 0

<NA> 0 0 0 1

, , c(5, 6, 6, 5) = 6

1:4

c(1, 2, 1, NA) 1 2 3 4

1 0 0 1 0

2 0 1 0 0

<NA> 0 0 0 0

Zwróć uwagę, że pierwsza i ostatnia tablica ma cztery niezerowe elementy, ale druga tablica ma tylko trzy, ponieważ NA jest wykluczona. Funkcja as.table() przyjmuje argumenty x i  . . . .Argument x jest obiektem, który ma zostać przekształcony w tabelę klas. Argument musi być w trybie numerycznym. Argument . . . dostarcza argumentów dla funkcji niższego poziomu. Funkcja is.table() przyjmuje argument x i zwraca wartość TRUE, jeśli x należy do tabeli klas i FALSE, jeśli nie. Więcej informacji na temat table(), as.table() i is.table() można znaleźć, wpisując ?table() w wierszu polecenia R.

(IV) Funkcje aggregate(), table(), tabulate() i ftable()

Podobnie jak funkcje zastosuj, funkcja aggregte() wyszukuje statystyki dla grup danych. Funkcje table(), tabulate() i ftable() tworzą na podstawie danych tabele awaryjne.

Funkcja aggregate()

Funkcja aggregate() stosuje funkcję do elementów obiektu na podstawie wartości innego obiektu. Obiekt, na którym ma być wykonywana operacja, jest szeregiem czasowym, ramką danych lub obiektem, który można przekształcić w ramkę danych. Wartości drugiego obiektu muszą być listą zawierającą elementy, które można zinterpretować jako czynniki, a na drugim poziomie musi mieć długość równą wierszom ramki danych lub szeregu czasowego. Funkcja inaczej traktuje ramki danych i szeregi czasowe.

Ramki danych

W przypadku ramek danych argumentami są x, by, FUN,. . . i uprościć. Argument x jest ramką danych. Argument by jest obiektem listy trybów składającej się z elementów, które mogą być interpretowane jako czynniki. Elementy by służą do grupowania wierszy x. Argument FUN to funkcja, która ma zostać zastosowana, a. . . są dodatkowymi argumentami dla tej funkcji. Argument simplify mówi agregatowi (), czy próbować uprościć wynik do wektora czy macierzy. Wartość domyślna to TRUE. Wynikiem agregacji () dla ramki danych jest ramka danych. Oto przykład:

> x2=rep(1:2,3)

> x1=rep(1:2,3)

> y1=1:6

> y2=7:12

> a.df=data.frame(y1,y2,x1,x2)

> a.df

y1 y2 x1 x2

1 1 7 1 1

2 2 8 2 2

3 3 9 1 1

4 4 10 2 2

5 5 11 1 1

6 6 12 2 2> aggregate(a.df[,1:2], list(x1,x2), mean)

Group.1 Group.2 y1 y2

1 1 1 3 9

2 2 2 4 10

W przypadku ramek danych można użyć formuły do ​​sklasyfikowania x zamiast używania argumentu by. W przypadku opcji formuły argumentami są formuła, dane, FUN,. . ., podzbiór i na. akcja. Formuła argumentu ma postać y ~ x, gdzie y jest liczbą i może mieć więcej niż jedną kolumnę, a x jest formułą, taką jak x1 lub x1 + x2, gdzie zarówno x1, jak i x2 można interpretować jako czynniki. Argument data podaje nazwę ramki danych i musi zostać uwzględniony. Argument FUN to funkcja, która ma zostać zastosowana, a. . . zawiera dodatkowe argumenty dla ZABAWY. Podzbiór argumentów podaje wiersze ramki danych, na których należy operować. Argument na.action umożliwia wybór sposobu obsługi brakujących wartości i jest łańcuchem znaków. Wartością domyślną jest „na.omit”, co oznacza, że ​​funkcja agregatu () ma pomijać brakujące wartości. Oto przykład:

> a.df

y1 y2 x1 x2

1 1 7 1 1

2 2 8 2 2

3 3 9 1 1

4 4 10 2 2

5 5 11 1 1

6 6 12 2 2

> aggregate(cbind(y1,y2)~x1+x2, data=a.df, sum, subset=1:3)

x1 x2 y1 y2

1 1 1 4 16

2 2 2 2 8

Zwróć uwagę, że zmienna by musi być listą, podczas gdy prawa strona formuły nie może być listą.

Szereg czasowy

Szeregi czasowe mają zarówno częstotliwość, jak i okres. W R częstotliwość jest odwrotnością okresu i odwrotnie. Na przykład rok może być okresem zainteresowania. Następnie miesiące mają częstotliwość 12, a podokresy 1/12. W przypadku szeregów czasowych argumentami są x, nfrequency, FUN, ndeltat, ts.eps i. . .. Argument x musi być szeregiem czasowym. Argument nfrequency to liczba podokresów dla każdego okresu po zadziałaniu FUN na szeregach czasowych. Wartość musi być równo podzielona na pierwotną częstotliwość szeregów czasowych. Argument domyślnie jest równy 1. (Oryginalna częstotliwość szeregów czasowych podzielona przez nfrequency daje liczbę elementów, które są zgrupowane razem – na których działa FUN). Argument FUN to funkcja, którą należy zastosować i. . . daje ZABAWIE dodatkowe argumenty. Argument. . . znajduje się na końcu listy argumentów. Funkcja FUN musi być poprawna dla wartości szeregów czasowych i jest domyślnie sumą.

Argument ndeltat informuje agregat () o długości podokresów dla danych wyjściowych i domyślnie jest równy 1. Iloczyn częstotliwości pierwotnego szeregu czasowego i ndeltat musi być liczbą całkowitą. Można ustawić nfrequency lub ndeltat. Drugi jest ustawiony na odwrotność jednego zestawu. Argument ts.eps podaje tolerancję dla zaakceptowania tego, że częstotliwość nfrequency dzieli się równomiernie na częstotliwość szeregu czasowego. Domyślnie nfrequency równa się getOption („ts.eps”), której wartość można znaleźć, wprowadzając opcje („ts.eps”) po znaku zachęty R. Wartość jest numeryczna i można ją ustawić ręcznie. Oto przykład:

> x1=c(1,2,1,2,1,2)

> x2=c(1,2,3,1,2,3)

> a.ts=ts(cbind(x1,x2), start=1, frequency=3)

> a.ts

Time Series:

Start = c(1, 1)

End = c(2, 3)

Frequency = 3

x1 x2

1.000000 1 1

1.333333 2 2

1.666667 1 3

2.000000 2 1

2.333333 1 2

2.666667 2 3

> aggregate(a.ts, FUN=sum)

Time Series:

Start = 1

End = 2

Frequency = 1

x1 x2

1 4 6

2 5 6

Zauważ, że w przykładzie nfrequency i ndeltat oba są równe jeden. Więcej informacji o aggregate() można znaleźć, wpisując ?aggregate w wierszu polecenia R.

(IV) Funkcje lapply(), sapply() i vapply()

Funkcje lapply(), sapply() i vapply() działają z wektorami, w tym listami i wyrażeniami. Jeśli X nie jest listą, X jest wymuszane na liście. Elementy muszą mieć odpowiedni tryb dla zastosowanej funkcji. Funkcja lapply () jest najprostsza z zaledwie dwoma argumentami i dowolnymi argumentami funkcji, która ma zostać zastosowana. Funkcja sapply () przyjmuje cztery argumenty plus wszelkie dodatkowe argumenty dla funkcji, która ma zostać zastosowana. Funkcja vapply () również pobiera cztery argumenty plus dodatkowe, aby funkcja została zastosowana.

Funkcja lapply()

Funkcja lapply () przyjmuje argumenty X i FUN oraz wszelkie dodatkowe argumenty funkcji FUN. Funkcja FUN jest stosowana do każdego elementu wektora lub każdego elementu najwyższego poziomu listy. Rezultatem jest lista. Oto przykład:

> b.list = lista (1: 7,3: 4)

> b.list

[[1]]

[1] 1 2 3 4 5 6 7

[[2]]

[1] 3 4

> lapply (b.list, sum)

[[1]]

[1] 28

[[2]]

[1] 7

Operatory arytmetyczne można wprowadzać, umieszczając je w cudzysłowie.

Na przykład:

> lapply (1: 2, “^”, 2)

[[1]]

[1] 1

[[2]]

[1] 4

Funkcja sapply()

Funkcja sapply () działa również na wektorach, w tym na listach i wyrażeniach. Funkcja przyjmuje argumenty X i FUN, a następnie wszystkie argumenty do FUN, po których następują argumenty simplify i USE.NAMES. Argument simplify może być logiczny lub ciąg znaków „tablica”. Argument simplify mówi sapply (), aby uprościć listę do wektora lub macierzy, jeśli jest TRUE, i do tablicy, jeśli jest ustawiona na „tablica”. Żadne uproszczenie nie jest wykonywane, jeśli ustawiona jest wartość FALSE. W przypadku FALSE zwracana jest lista. Wartość PRAWDA jest wartością domyślną. Argument USE.NAMES jest argumentem logicznym. W przypadku obiektu o znaku trybu argument USE.NAMES mówi sapply (), aby używała elementów obiektu jako nazw wyniku. Wartość domyślna to TRUE. Oto przykład:

> lista ab

jeden dolar

[1] 1 2 3 4 5

dwa dolary

[1] 3 4 5 6 7

> sapply (lista abonentów, suma)

jeden dwa

15 25

> a.char

[1] “a7” “a8” “a9” “a10”

> sapply (a.char, wklej, “b”, sep = “”)

a7 a8 a9 a10

„a7b” „a8b” „a9b” „a10b”

> sapply (a.char, wklej, “b”, sep = “”, USE.NAMES = F)

[1] „a7b” „a8b” „a9b” „a10b”

Funkcja vapply()

Funkcja vapply () przyjmuje argumenty X, FUN, FUN.VALUE, dowolne argumenty do FUN i USE.NAMES, w tej kolejności. Argument FUN.VALUE jest strukturą danych wyjściowych funkcji. Struktura jest strukturą wynikającą z zastosowania FUN do pojedynczego elementu X. W strukturze zastosowano atrapy wartości prawidłowego trybu. Liczba i tryb atrapy elementów muszą być poprawne. Wszelkie dodatkowe argumenty za FUN  są umieszczane po FUN.VALUE. Domyślna wartość USE.NAMES to TRUE. Oto przykład:

> set.seed (382765)

> e

[1] 1 2

> vapply (e, rnorm, matrix (.1,2,2), n = 4, sd = 1)

,, 1

[, 1] [, 2]

[1,] 1,701435 1,1422971

[2,] 2,068151 0,9604146

,, 2

[, 1] [, 2]

[1,] 0,3541925 1,186276

[2,] 2,6841000 1,745577

W tym przykładzie e jest wektorem średnich wprowadzonych do funkcji rnorm (), a pozostałe argumenty funkcji rnorm () to n = 4 i sd = 1. Funkcja vapply () zwraca tablicę, macierz lub wektor obiektów typu podanego przez argument FUN.VALUE. Więcej informacji o lapply (), sapply () i vapply () można znaleźć, wpisując? Lapply po znaku zachęty R.