(VI) Funkcja cat()

Funkcja cat() może służyć do wysyłania danych z funkcji do konsoli, pliku lub połączenia. Nazwa funkcji cat oznacza konkatenację. Obiekty, które mają być łączone, muszą mieć tryb atomowy i być oddzielone przecinkami. Obiekty są przekształcane w wektory. Funkcja ma pięć argumentów innych niż obiekty, które mają być połączone. Pięć argumentów to file, sep, fill, labels i append. Argument file mówi cat(), gdzie wysłać dane wyjściowe. Argument jest ciągiem znaków i może być adresem pliku, połączeniem lub „” -dla konsoli. Wartość domyślna to „”. Argument sep to ciąg znaków. Wartość sep oddziela obiekty wydrukowane w wyniku. Wartość domyślna to „”.

Argument fill jest zmienną logiczną lub liczbą dodatnią. Jeśli FALSE, podziały wierszy są ustawiane za pomocą „\n” lub znaku końca w ciągu cytowanym. Jeśli TRUE, wartość szerokości opcji jest używana do ustawienia szerokości wyjścia. Jeśli wypełnienie jest liczbą dodatnią, to liczba służy do ustawiania szerokości. Wartość domyślna to FALSE. Etykiety argumentów to wektor ciągów znaków, który jest używany do etykietowania wierszy wyniku i jest używany tylko wtedy, gdy wypełnienie ma wartość PRAWDA lub wartość liczbową. Wartość domyślna to NULL.  Argument append jest używany, gdy plik jest plikiem zewnętrznym. Jeśli TRUE, dane wyjściowe są dołączane do pliku. W przeciwnym razie plik zostanie nadpisany. Wartość domyślna to FALSE. Ciąg „\n” mówi cat(), aby przejść do następnej linii. Podział wiersza można również wprowadzić, przerywając wiersz w ciągu cytowanym w cudzysłowie. Na przykład:

> set.seed(69235)

> x=1:4

> y= runif(4)

> a.lm=lm(y~x)

> a.sm=summary(a.lm)

> cat(“\nThe intercept is “, round(coef(a.lm)[1],3), “. The slope is “,

round(coef(a.lm)[2],3), “. The F statistic is “, round(a.sm$f[1],4), ” on

“, a.sm$f[2], ” and “, a.sm$f[3], ” degrees of freedom. The p value is “,

round(1-pf(a.sm$f[1], a.sm$f[2], a.sm$f[3]),4), “.\n”, sep=””)

The intercept is -0.301. The slope is 0.257. The F statistic is 4.5039 on 1

and 2 degrees of freedom. The p value is 0.167

> cat(round(coef(a.lm)[1],3), round(coef(a.lm)[2],3), round(a.sm$f[1],4),

a.sm$f[2], a.sm$f[3],

+ round(1-pf(a.sm$f[1], a.sm$f[2], a.sm$f[3]), 3), fill=17, labels =

c(“intercept “, “slope “,

+ “F “, “df 1 & 2 “, “p value “))

intercept -0.301

slope 0.257

F 4.5039

df 1 & 2 1 2

p value 0.168

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

(VI) Funkcje round(), signif() i noquote()

Funkcje round(), signif() i noquote() ułatwiają odczytywanie wyniku.

Funkcja round()

Funkcja round () zaokrągla elementy obiektów trybu numerycznego lub zespolonego do podanej liczby cyfr po przecinku. Funkcja przyjmuje dwa argumenty, obiekt do zaokrąglenia, x oraz liczbę cyfr, cyfry. Ujemna liczba cyfr zaokrągla do miejsc po lewej stronie przecinka dziesiętnego. Na przykład:

> round(c(1.2344, 5.67, 1234.567),3)

[1] 1.234 5.670 1234.567

> round(rnorm(3)+63, -1)

[1] 60 60 60

> round(1.34+3.0i,1)

[1] 1.3+3i

Zauważ, że wszystkie zwrócone wartości mają taką samą liczbę miejsc po przecinku, jeśli istnieje, z wyjątkiem tego, że części rzeczywiste i urojone liczb zespolonych są traktowane oddzielnie. Domyślna wartość cyfr to zero. Zobacz stronę pomocy funkcji round (), aby poznać zasady zaokrąglania, jeśli ostatnia cyfra x jest równa pięć.

Funkcja signif()

Funkcja signif() zaokrągla elementy obiektu liczbowego lub złożonego do określonej liczby cyfr znaczących. Funkcja przyjmuje dwa argumenty, obiekt x i liczbę cyfr znaczących cyfrę. Na przykład:

> signif (c (1,2344; 5,67; 1234,567); 3)

[1] 1,23 5,67 1230,00

> signif (rnorm (3) + 63, -1)

[1] 60 60 60

> signif (1,34 + 3,0i; 1)

[1] 1 + 3i

Zauważ, że podobnie jak round(), wszystkie zwrócone liczby wychodzą do tej samej liczby miejsc, ale cyfry znaczące są ograniczone do liczby całkowitej podanej przez cyfrę. Jeśli dla cyfry podano wartość mniejszą niż jeden, to liczba cyfr znaczących jest ustawiana na jeden. Domyślna wartość cyfry to sześć.

Funkcja noquote()

Funkcja noquote() zwraca dane wyjściowe, w których cudzysłowy zostały usunięte ze wszystkich ciągów znaków w obiekcie. Funkcja przyjmuje jeden argument obj, który może być obiektem dowolnego typu. Na przykład:

> noquote (c (“a”, “bc”, “d”))

[1] a bc d

Więcej informacji o round () i signif () można znaleźć, wpisując ?signif w wierszu polecenia R. Więcej informacji o noquote() można znaleźć, wpisując ?noquote w wierszu polecenia R

(VI) Funkcja options()

Obecnie w moim systemie Windows jest 55 opcji w  funkcji options(). Opcje są ładowane podczas ładowania pakietów. Aby zobaczyć listę opcji wraz z ich ustawionymi wartościami, wprowadź options() w wierszu polecenia R. Na liście znajdują się opcje dla wszystkich załadowanych pakietów. Aby zobaczyć wartości konkretnych opcji, wpisz opcje („opt1”, „opt2”,…, „opt_n”) w wierszu polecenia R, gdzie od opt1 do opt_n to nazwy opcji. Aby uzyskać dostęp do wartości opcji, użyj getOption („opt”), gdzie opt jest nazwą opcji. Aby ustawić wartości opcji, wprowadź opcje (opt1 = wartość1, opt2 = wartość2, opt3 = wartość3,…, opt_n = wartość_n) w wierszu polecenia R, gdzie od opt1 do opt_n to opcje, a wartość_1 do wartość_n to wartości przypisane do opcji. Zwróć uwagę, że w celu ustawienia i uzyskania dostępu do opcji, opcja jest wprowadzana jako ciąg znaków (w cudzysłowach), podczas gdy w przypadku ustawiania wartości opcja jest wprowadzana jako obiekt (bez cudzysłowów). Aby uzyskać opis opcji i pakietów, do których należą, wprowadź ?options w wierszu polecenia R. Gdy opcje są zmieniane podczas sesji języka R, zmiana jest dobra tylko dla sesji. Aby zmienić wartości opcji domyślnych, które są ładowane po uruchomieniu R, spróbuj utworzyć plik .Rprofile w tym samym folderze co .RData i .Rhistory. Jeśli plik jeszcze nie istnieje, ta metoda działa. Jeśli plik istnieje, edycja pliku działa. Plik .Rprofile musi być zwykłym plikiem tekstowym bez rozszerzenia. Plik mówi R, jakie funkcje mają być uruchomione podczas uruchamiania Umieszczenie w pliku wierszy uruchamiających opcje () ustawia domyślne opcje. Na przykład zawartość .Rprofile może wyglądać następująco:

options(defaultPackages=c(getOption(“defaultPackages”),”MASS”),

contrasts=c(“contr.sum”,”contr.poly”))

Tutaj pakiet MASS jest dodawany do pakietów, które są ładowane podczas uruchamiania, a kontrast dla nieuporządkowanych czynników jest zmieniany z domyślnego „traktowanie kontr.” Na „suma kontr.”. Więcej informacji na temat procesu uruchamiania można znaleźć, wpisując ?Startup po znaku zachęty R.

Niektóre opcje obejmują:

continue-ciąg znaków-podaje to, co R drukuje na konsoli, gdy więcej niż jedna linia jest używana dla kodu R-domyślną wartością jest „+”.

contsrast – ciągi znaków – typy kontrastów, które mają być używane dla danych czynników w modelach liniowych – wartości domyślne to „obróbka kontr.” dla kontrastów nieuporządkowanych i „polaryzacja kontr.” dla kontrastów uporządkowanych – inne możliwe wartości to „suma kontr.” i „Kontr. Helmert” – informacje na temat kontrastów można znaleźć, wpisując? Kontrasty po znaku zachęty R.

defaultPackages-ciągi znaków-pakiety, które mają być ładowane domyślnie po uruchomieniu R – domyślne wartości to „datasets”, „utils”, „grDevices”, „graphics”, „stats” i „methods” (baza jest zawsze ładowana ).

digits – liczba całkowita – zalecenie dotyczące liczby cyfr, które mają zostać zwrócone w przypadku liczb – R niekoniecznie używa zalecanej liczby – domyślna wartość to „7”.

editor-ciąg znaków-daje edytorowi wywoływane przez funkcję edit () wartość domyślna różni się w zależności od systemu operacyjnego. Więcej informacji znajdziesz na stronie pomocy dla edit ().

expressions – liczba całkowita – jak głębokie może dojść do zagnieżdżenia – wartość może wynosić od 25 do 500 000 – wartość domyślna to „5000”.

na.action-ciąg znaków dający funkcję-daje opcję braku wartości-domyślną wartością jest „na.omit” -inne wartości to „na.fail”, „na.pass” i „na.exclude” – zobacz strony pomocy dla na.omit (), na.fail (), na.pass () i na.exclude (), aby uzyskać więcej informacji.

scipen-an integer-opcja, która daje R tendencję do notacji naukowej (liczby całkowite ujemne) lub notacji ustalonej (liczby całkowite dodatnie) -zobacz stronę pomocy options (), aby uzyskać więcej informacji -wartość domyślna to „0”.

show.coef.Pvalues-wartość logiczna-opcja, która mówi R, czy pokazywać wartości p w danych wyjściowych summary () z modeli liniowych – domyślną wartością jest „PRAWDA”.

show.signif.stars – wartość logiczna – opcja, która mówi R, czy wyświetlać gwiazdy, aby podać poziomy istotności w wynikach podsumowania () z modeli liniowych – wartością domyślną jest „PRAWDA”.

stringsAsFactor – wartość logiczna – mówi data.frame () i read.table (), czy konwertować ciągi znaków na czynniki – domyślną wartością jest „TRUE” – tak konwertuj łańcuchy.

OutDec – pojedynczy ciąg znaków – podaje wartość do użycia jako przecinek dziesiętny – wartością domyślną jest „.”.

prompt-ciąg znaków-wartość, która ma być używana jako zachęta R-domyślna wartość to „>”.

ts.eps-wartość liczbowa-poziom tolerancji do porównywania okresów w więcej niż jednej serii czasowej – domyślna wartość to „1,0e-5”

(V) Funkcja switch()

Funkcja switch() przyjmuje dowolną liczbę argumentów. Pierwszy argument mówi switch (), który z poniższych argumentów ma zwrócić. Argumenty występujące po pierwszym argumencie to zwracane obiekty. Pierwszy argument musi być numeryczny, logiczny, złożony, znakowy lub NA i musi składać się z pojedynczego elementu. Reszta argumentów może mieć dowolny tryb i wymiar. Przecinki oddzielają argumenty. Jeśli pierwszy argument jest liczbowy, liczba jest zaokrąglana w dół do liczby całkowitej; jeśli jest to logiczne, TRUE jest wymuszane na 1, a FALSE na 0; a jeśli jest złożony, część urojoną jest odrzucana, a część rzeczywista jest traktowana jak numeryczna. Funkcja zwraca argument wskazany przez pierwszy argument. Na przykład, jeśli pierwszy argument to 3, to zwracany jest czwarty argument. To jest:

> switch(3,5,”a”,”b”,6)

[1] “b”

Jeśli pierwszy argument jest większy niż liczba argumentów minus jeden, jest mniejszy niż jeden lub ma wartość NA, to zwracany jest obiekt NULL. Na przykład:

> switch(0,1,2,3)

> mode(switch(0,1,2,3))

[1] “NULL”

Ciąg znaków dla pierwszego elementu powoduje, że funkcja switch () zachowuje się inaczej. Funkcja sprawdza nazwy argumentów występujących po ciągu znaków, aby spróbować znaleźć dopasowanie. Wszystkie poniższe argumenty muszą zostać nazwane z wyjątkiem jednego możliwego elementu bez nazwy. (Argumenty można nazwać na liście, wprowadzając nazwę, po której następuje znak równości, po którym następuje – opcjonalna – wartość.) Jeśli istnieje argument bez nazwy, wówczas ten argument staje się wartością domyślną, jeśli nie ma dopasowania do ciąg znaków. Jeśli nie ma argumentu bez nazwy, wartością domyślną jest obiekt NULL. Na przykład:

> switch(“e”, a=1, b=2, c=3, d=4, e=f.fun(0))

[1] 1.959964

> switch(“e”, a=1, b=2, c=3, d=4, 25)

[1] 25

> switch(“e”, a=1, b=2, c=3, d=4)

> mode(switch(“e”, a=1, b=2, c=3, d=4))

[1] “NULL”

Nienazwany argument może pojawić się w dowolnym miejscu listy oprócz pierwszego argumentu. Jeśli wprowadzono więcej niż jeden nienazwany argument, funkcja switch () zwraca błąd. Dzięki ciągowi znaków dla pierwszego argumentu, kolejnym argumentom nie trzeba przypisywać wartości, a jedynie nazwę. Jeśli ciąg znaków pasuje do nazwy bez wartości, to funkcja switch () kontynuuje wyświetlanie listy argumentów i zwraca wartość następnego argumentu z wartością. Jeśli żaden z kolejnych argumentów nie zawiera wartości, przełącznik zwraca obiekt NULL. Na przykład:

> switch(“b”, a=1,b=2,c=,d=,e=5)

[1] 2

> switch(“b”, a=1, b=, c=3, d=)

[1] 3

> switch(“b”, a=1, b=, c=, d=)

> mode(switch(“b”, a=1, b=, c=, d=))

[1] “NULL”

Zauważ, że pierwszy argument jest ujęty w cudzysłów, podczas gdy nazwy kolejnych argumentów nie. Funkcja switch () może być zagnieżdżona. Więcej informacji na temat funkcji switch () można znaleźć, wpisując? Switch w wierszu polecenia R

(V)Funkcja ifelse()

Funkcja ifelse() przyjmuje trzy argumenty. Pierwszym jest obiekt logiczny lub dowolny obiekt, który można przekształcić w logikę, taki jak obiekty modów atomowych lub obiekty z listy trybów, w których lista ma tylko jeden poziom głębi i każdy element przyjmuje tylko jedną wartość. Można również użyć funkcji zwracającej wartości, które można przekształcić w wartości logiczne. Drugi argument to wartości, które mają zostać zwrócone, gdy pierwszy argument jest prawdziwy. Trzeci argument to wartości, które mają zostać zwrócone, gdy pierwszy argument jest fałszywy. Każdy element pierwszego argumentu jest testowany osobno. Elementy postaci trybu i brakujące elementy zwracają NA. W przeciwnym razie zwracana wartość dla danego elementu to wartość na tej samej pozycji w drugim (lub trzecim) argumencie. Na przykład, jeśli pierwszym argumentem jest wektor (T, T, F, T), drugim argumentem jest wektor (1,2,1,2), a trzecim argumentem (4,5,6,4) , to ifelse () zwraca (1,2,6,2). To jest:

> ifelse (c (T, T, F, T), c (1: 2,1: 2), c (4: 6,4))

[1] 1 2 6 2

Jeśli to możliwe, wynik ma takie same wymiary jak pierwszy argument. W przeciwnym razie zwracany jest wektor listy trybów o długości równej długości pierwszego argumentu. Na przykład:

> a.mat = matrix(0:3,2,2)

> a.mat

[,1] [,2]

[1,] 0 2

[2,] 1 3

> a.list = list(a.mat,c(“a”,”b”,”c”))

> a.list

[[1]]

[,1] [,2]

[1,] 0 2

[2,] 1 3

[[2]]

[1] “a” “b” “c”

> ifelse(a.mat,1:4,30:33)

[,1] [,2]

[1,] 30 3

[2,] 2 4

> ifelse(a.mat,1:4,a.list)

[[1]]

[,1] [,2]

[1,] 0 2

[2,] 1 3

[[2]]

[1] 2

[[3]]

[1] 3

[[4]]

[1] 4

Zauważ, że w drugim wywołaniu ifelse () pierwszy element a.mat daje FALSE, a pierwszy element a.list to macierz, więc lista jest generowana. Jeśli długość pierwszego argumentu jest mniejsza niż długość drugiego (lub trzeciego) argumentu, zostaną użyte tylko te elementy w drugim (lub trzecim) argumencie do długości pierwszego argumentu. Na przykład:

> ifelse (c (T, F), 1: 5, 10:15)

[1] 1 11

Pierwszy element 1: 5 to 1, a drugi element 10:15 to 11, więc zwracane jest (1,11). Jeśli długość pierwszego argumentu jest większa niż długość drugiego (lub trzeciego) argumentu, drugi (lub trzeci) argument jest cykliczny. Na przykład:

> ifelse (c (T, F, F, F, T), 1: 3, 10:12)

[1] 1 11 12 10 2

Drugi argument przechodzi do (1,2,3,1,2), a trzeci argument przechodzi do (10,11,12,10,11). Jeśli tryby elementów wynikowych nie są takie same, wynik będzie miał tryb elementu o najwyższej hierarchii, w którym hierarchia przechodzi od najniższej do najwyższej logicznej, całkowitej, podwójnej, zespolonej, znakowej i listowej. Obiekty trybu NULL i raw powodują błąd. Na przykład:

> ifelse (c (T, F, F, F, T), 1: 5 + 1i, 1: 5)

[1] 1 + 1i 2 + 0i 3 + 0i 4 + 0i 5 + 1i

> ifelse (c (T, F, F, F, T), as.raw (2: 6), as.raw (12:16))

Error in ifelse(c(T, F, F, F, T), as.raw(2:6), as.raw(12:16)) :

incompatible types (from raw to logical) in subassignment type fix

Funkcji można użyć jako wartości dowolnego z trzech argumentów. Jeśli funkcja jest oceniana, wynik funkcji jest zwracany jako pierwszy. Ostatni wynik jest wynikiem zamiany. Na przykład:

> f.fun = function(mu, se=1, alpha=.05){

q_value = qnorm(1-alpha/2, mu, se)

print(q_value)

}

> ifelse (f.fun(1:2, alpha=1.0), f.fun(1:2), f.fun(3))

[1] 1 2

[1] 2.959964 3.959964

[1] 2.959964 3.959964

> ifelse (f.fun(0:2, alpha=1.0), f.fun(1:2), f.fun(3))

[1] 0 1 2

[1] 2.959964 3.959964

[1] 4.959964

[1] 4.959964 3.959964 2.959964

Zauważ, że w pierwszym wywołaniu f.fun(), alpha jest ustawiana na 1.0, więc zwracana jest mediana. Ponadto w pierwszym wywołaniu oceniane są dwie pierwsze funkcje, podczas gdy w drugim wywołaniu oceniane są wszystkie trzy funkcje. Jeśli wynik jest przypisany do obiektu, to wyniki funkcji są wypisywane na konsoli, ale wynik ifelse() jest przekazywany do obiektu. Na przykład:

> a=ifelse (f.fun(1:2, alpha=1.0), f.fun(1:2), f.fun(3))

[1] 1 2

[1] 2.959964 3.959964

> a

[1] 2.959964 3.959964

Funkcja ifelse () może być zagnieżdżona. Na przykład łańcuch Markowa pierwszego rzędu o długości sześć z dwoma stanami, w których znajduje się macierz przejścia

można wygenerować za pomocą zagnieżdżonych funkcji ifelse (). Oznacza to, że „A” będzie pierwszym stanem, a „B” drugim stanem:

> set.seed(6978)

> mc=”A”

> for (i in 2:6) {

+ rn = runif(1)

+ mc = c(mc, ifelse(mc[i-1]==”A”, ifelse(rn<=0.7,”A”,”B”),

ifelse(rn<=0.8,”B”,”A”)))

+ }

> mc

[1] “A” “A” “B” “B” “B” “B”

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

(V) Pętla „for”, pętla „repeat”, instrukcja „if” i instrukcja „break”

W tym przykładzie losowe próbki o rozmiarze 100 standardowych liczb normalnych są generowane w pętli powtarzania, która znajduje się w pętli for, która przechodzi przez 10 000 iteracji. Dla każdej próbki sumę próbki dzieli się przez pierwiastek kwadratowy z 100, a następnie porównuje z 1,965. Jeśli wartość jest mniejsza niż 1,965, pętla powtarzania jest kontynuowana.

W przeciwnym razie pętla powtarzania zatrzymuje się, rejestrowana jest liczba powtórzeń pętli i rozpoczyna się następna pętla for. Na końcu wektor liczb przechodzących przez pętlę jest wykreślany na histogramie i znajduje średnią i medianę liczby razy. Najpierw ustawiane jest ziarno dla generatora liczb losowych. Wtedy jest wektor n.hist utworzony do przechowywania wyników, z miejscem na każdą iterację pętli for. Następnie otwiera się pętla for i licznik n jest ustawiany na zero. Następnie otwiera się pętla powtarzania. Na początku pętli powtarzania licznik n jest zwiększany o jeden. Następnie pobierana jest próbka, dzielona przez dziesięć, a wynik jest równy x. Następnie wartość x jest porównywana z 1,965 w instrukcji if. Jeśli wartość jest większa niż 1,965, to n.hist dla indeksu i jest równe licznikowi n, a instrukcja break przerywa funkcję z pętli powtarzania. W przeciwnym razie pętla powtarzania będzie kontynuowana w pętli. Na końcu uruchamiana jest funkcja hist () w celu utworzenia histogramu n.hist, średnia () w celu znalezienia średniej z n.hist, a metoda mediana () w celu znalezienia mediany z n.hist. Oto przykład:

> set.seed(69785)

> n.hist = numeric(10000)

> for (i in 1:10000) {

+ n=0

+ repeat{

+ n=n+1

+ x=sum(rnorm(100)/10)

+ if (x>1.965) {n.hist[i]=n; break}

+ }

+ }

> hist(n.hist)

> mean(n.hist)

[1] 40.4769

> median(n.hist)

[1] 28

Należy zauważyć, że średnia jest bliska 40, co jest przewidywaną średnią liczbą prób niezbędnych do zobaczenia zdarzenia z prawdopodobieństwem wystąpienia 0,025. Jednak mediana jest znacznie mniejsza, ponieważ rozkład jest mocno wypaczony.

Korzystanie z indeksów

Aby wykonać ten przykład przy użyciu indeksów, stwierdziliśmy, że pętla powtarzania jest konieczna, ale można zrezygnować z pętli for. Ponownie, ziarno generatora liczb losowych jest ustawione na tę samą liczbę, co w pierwszej części przykładu, a n.hist jest zdefiniowane numerycznie z 10000 elementów. Następnie licznik n jest ustawiany na zero, licznik cl.sv jest ustawiany na zero, a licznik n.col jest ustawiany na 10000. Następnie otwiera się pętla powtarzania. Macierz x jest zdefiniowana jako macierz składająca się ze 100 wierszy i n.col kolumn (początkowo 10 000). Elementy x to 100 razy n.col losowo generowane standardowe liczby normalne. Następnie funkcja apply () jest używana do zsumowania każdej kolumny macierzy, a wynik jest przypisywany do x. Następnie każdy element x jest dzielony przez 10. Następnie długość wektora zawierającego te elementy x, które są większe niż 1,965, jest przypisywana do x. Następnie x jest dodawane do cl.sv, a n jest zwiększane o jeden. Następnie wartości n.hist są równe n, gdzie cl.sv i x są używane do określenia, gdzie wzdłuż wektora n.hist należy umieścić wartość n. Następnie n.col jest zmniejszane o wartość x. Pętla powtarzania trwa do momentu, gdy n.col będzie równe zero. Histogram n.hist jest generowany za pomocą funkcji hist (), średnią z n.hist za pomocą średniej (), a medianę n.hist za pomocą mediany (). Oto przykład:

> set.seed(69785)

> n.hist = numeric(10000)

> n = 0

> cl.sv = 0

> n.col = 10000

> repeat{

+ x = matrix(rnorm(n.col*100), 100, n.col)

+ x = apply(x, 2, sum)

+ x = x/10

+ x = length(x[x>1.965])

+ cl.sv = cl.sv + x

+ n = n+1

+ n.hist[(cl.sv-x+1):cl.sv] = n

+ n.col = n.col-x

+ if (n.col==0) break

+ }

> hist(n.hist)

> mean(n.hist)

[1] 40.5015

> median(n.hist)

[1] 28

Ponownie średnia jest bliska 40, a mediana 28. Obie metody wykorzystują mniej więcej taki sam czas. Jeśli wartość 10 000 zostanie zastąpiona powyżej 100 000, metoda zapętlenia zajmie około 53 sekund, a metoda indeksowania około 56 sekund na moim komputerze. Ponieważ proces generowania próbek losowych jest inny dla obu metod – druga metoda generuje więcej liczb niż pierwsza – wyniki dla dwóch metod nie są identyczne, mimo że materiał początkowy generatora liczb losowych jest taki sam

(V) Pętla „for”, instrukcja „if” i instrukcja „next”

W tym przykładzie generowane są standardowe normalne liczby losowe i porównywane z 1,965. Zachowywane są tylko te wartości, które są mniejsze lub równe 1,965. Najpierw ziarno generatora liczb losowych jest ustawiane na dowolną wartość. Następnie generowana jest pojedyncza standardowa liczba normalna. (Pomijamy możliwość, że liczba jest większa niż 1,965). W następnej pętli for, dla 10 000 iteracji, w każdej iteracji generowana jest standardowa normalna liczba losowa. Jeśli liczba jest większa niż 1,965, rozpoczyna się następna pętla. W przeciwnym razie liczba jest dodawana do wektora liczb. Przedstawiony jest histogram końcowego wektora. Oto przykład:

> set.seed(69785)

> x = rnorm(1)

> for (i in 1:10000) {

+ x2 = rnorm(1)

+ if (x2>1.965) next

+ x = c(x, x2)

+ }

> hist(x)

Korzystanie z indeksów

Korzystanie z indeksów jest znacznie prostsze. Po pierwsze, ziarno generatora liczb losowych jest ustawiane na taką samą wartość, jak w poprzednim przykładzie. Następnie generowany jest wektor standardowych normalnych zmiennych losowych o długości 10 001. Następnie zachowywane są tylko te wartości w wektorze, które są mniejsze lub równe 1,965. Na koniec generowany jest histogram wektora. Oto przykład:

> set.seed (69785)

> x = rnorm (10001)

> x = x [x <= 1,965]

> hist (x)

Zauważ, że te dwa histogramy są takie same, ponieważ nasiona są takie same i używane są te same 1001 liczb. Jeśli wartość 10 000 zostanie zwiększona do powyżej 100 000, na moim komputerze metoda wykorzystująca pętle zajmuje około 13 sekund, podczas gdy metoda wykorzystująca indeksy zajmuje mniej niż 1 sekundę

(V) Zagnieżdżone pętle „for”

Czasami potrzebne są różnice między każdą z kolumn macierzy. W tym przykładzie zagnieżdżone pętle for są używane do znajdowania różnic. Najpierw generowana jest macierz x z dwoma wierszami i czterema kolumnami, do której są przypisywane nazwy kolumn. Następnie wyświetlana jest macierz. Następnie generowana jest macierz xp zer z dwoma wierszami i sześcioma kolumnami w celu przechowywania wyników różnic, a macierzy przypisywane są puste nazwy kolumn. Następnie licznik k dla kolumn macierzy xp jest ustawiany na zero. Wraz ze wzrostem liczby pętli for, k będzie wzrastać o jeden na każdym kroku. Następnie uruchamiane są dwie pętle for. W pętlach elementy xp są wypełnione różnicami między różnymi kolumnami w x. Dwie pętle przechodzą w pętli przez kolumny macierzy x w taki sposób, że żadne kombinacje kolumn nie są powtarzane, a dwie kolumny nigdy nie są takie same. Na każdym kroku kolumny xp mają przypisane nazwy na podstawie nazw w x. Na koniec wyświetlana jest wynikowa macierz xp. Oto przykład:

> x = matrix(1:8,2,4)

> colnames(x) = paste(“c”, 1:4, sep=””)

> x

c1 c2 c3 c4

[1,] 1 3 5 7

[2,] 2 4 6 8

> xp = matrix(0,2,6)

> colnames(xp) = rep(“”,6)

> xp

[1,] 0 0 0 0 0 0

[2,] 0 0 0 0 0 0

> k=0

> for (i in 1:3) {

+ for (j in (i+1):4) {

+ k = k+1

+ xp[,k] = x[,i]-x[,j]

+ colnames(xp)[k] = paste(colnames(x)[i], “-“, colnames(x)[j], sep=””)

+ }

+ }

> xp

c1-c2 c1-c3 c1-c4 c2-c3 c2-c4 c3-c4

[1,] -2 -4 -6 -2 -4 -2

[2,] -2 -4 -6 -2 -4 -2

Zauważ, że liczba kolumn w xp jest równa p (p-1) / 2, gdzie p jest liczbą kolumn w x.

Korzystanie z indeksów

Aby rozwiązać ten problem za pomocą indeksów, tworzone są dwa wektory indeksów. Najpierw generowana jest początkowa macierz x, przypisywane nazwy kolumn i wyświetlane. Następnie tworzone są dwa zbiory indeksów o tej samej długości, indeks 1 i indeks 2. Odpowiednie indeksy w obu zestawach nigdy nie są takie same, a wszystkie możliwe kombinacje są obecne i występują tylko raz. Następnie otrzymana macierz xp jest tworzona przez odjęcie kolumn x w drugim zestawie indeksów od kolumn x w pierwszym zestawie indeksów. Następnie nazwy kolumn dla xp są tworzone i przypisywane za pomocą metody paste () i dwóch zestawów indeksów. Na koniec wyświetlana jest macierz xp. Oto przykład:

> x = matrix(1:8,2,4)

> colnames(x) = paste(“c”, 1:4, sep=””)

> x

c1 c2 c3 c4

[1,] 1 3 5 7

[2,] 2 4 6 8

> ind.1 = rep(1:3,3:1)

> ind.1

[1] 1 1 1 2 2 3

> ind.2 = 2:4

> for(i in 3:4) ind.2 = c(ind.2,i:4)

> ind.2

[1] 2 3 4 3 4 4

> xp = x[,ind.1] – x[,ind.2]

> colnames(xp) = paste(“c”, ind.1, “-“,”c”, ind.2, sep=””)

> xp

c1-c2 c1-c3 c1-c4 c2-c3 c2-c4 c3-c4

[1,] -2 -4 -6 -2 -4 -2

[2,] -2 -4 -6 -2 -4 -2

Zauważ, że pętla for służy do tworzenia drugiego zestawu indeksów. Ponadto indeksy kolumn są powtarzane w obu zestawach indeksów. W przypadku dużych macierzy druga metoda jest szybsza niż pierwsza. Na moim komputerze różnice kolumn dla dwóch macierzy, z których każda zawierała 43 830 wierszy i 35 kolumn, zostały znalezione za pomocą dwóch metod. Obie metody dały tę samą macierz 43 830 na 595. Metoda zapętlania zajęła około 1,5 sekundy, a metoda indeksowania około 1,0 sekundy

(V) Pętla „while”

W tym przykładzie pętla while służy do określenia, ile iteracji potrzeba, aby suma zmiennych rozłożonych losowo i równomiernie między zerem a jedynką była większa niż pięć. Po początkowym ustawieniu ziarna dla generatora liczb losowych i ustawieniu n i x na zero, rozpoczyna się pętla while w celu zwiększenia n i sumowania x. Liczba wygenerowana za pomocą generatora liczb losowych dla rozkładu równomiernego jest dodawana do x przy każdej iteracji. Gdy x jest większe niż pięć, zapętlenie zatrzymuje się. Wartości n i x są drukowane. Oto przykład:

> set.seed(129435)

> n=0

> x=0

> while (x<=5) {

+ x = x + runif(1)

+ n = n + 1

+ }

> n

[1] 7

> x

[1] 5.179325

Korzystanie z indeksów

Aby wykonać to samo zadanie za pomocą indeksów, generowany jest wektor jednolitych zmiennych losowych o długości większej niż oczekiwana dla wyniku sumy. Następnie funkcja cumsum (), która tworzy sumę skumulowaną wzdłuż wektora, jest używana do określenia, kiedy suma jest większa niż pięć. Ponieważ elementy x są zawsze większe od zera, skumulowana suma zawsze rośnie wzdłuż wektora. Następnie funkcja length () służy do znalezienia liczby elementów, dla których suma jest mniejsza lub równa pięć. Następnie drukowane są wartości n i x, gdzie x jest równe x [n].

> set.seed(129435)

> x = runif(25)

> x = cumsum(x)

> n = length(x[x<=5])+1

> x = x[n]

> n

[1] 7

> x

[1] 5.179325

Zauważ, że generator liczb losowych jest ustawiony na tę samą wartość początkową dla obu części przykładu, więc wyniki dla dwóch pasujących wyników, ponieważ generowane są te same pierwsze siedem liczb. Jeśli na moim komputerze podstawię 1 000 000 na 5 w powyższych przykładach i 3 000 000 na 25, metoda wykorzystująca indeksy jest prawie natychmiastowa, podczas gdy metoda wykorzystująca zapętlenie zajmuje około 9 sekund

(V) Zagnieżdżone pętle „for” z instrukcją „if / else”

W tym przykładzie wykonujemy podstawianie element po elemencie do macierzy na podstawie testu if / else. Najpierw generowana jest macierz x dwa na pięć i wyświetlana jest macierz. Następnie dwie pętle for przechodzą przez indeksy wierszy i kolumn x. W każdym cyklu zestaw instrukcji if / else sprawdza, czy element macierzy jest większy niż pięć. Jeśli wartość elementu jest większa niż pięć, wartość elementu jest zastępowana jedynką. Jeśli nie, kontrola przechodzi do instrukcji else. W instrukcji else wartość elementu jest zastępowana przez zero. Na koniec wyświetlana jest wynikowa macierz. Oto przykład:

> x = matrix(1:10,2,5)

> x

[,1] [,2] [,3] [,4] [,5]

[1,] 1 3 5 7 9

[2,] 2 4 6 8 10

> for (i in 1:2) {

+ for (j in 1:5) {

+ if ( x[i,j]>5 ) x[i,j]=1

+ else x[i,j]=0

+ }

+ }

> x

[,1] [,2] [,3] [,4] [,5]

[1,] 0 0 0 1 1

[2,] 0 0 1 1 1

Korzystanie z indeksów

Wykonanie tej samej zamiany bez pętli jest łatwiejsze. Najpierw generowana i wyświetlana jest macierz x. Następnie druga macierz, y, jest równa x. Macierz y służy do przechowywania wartości x, ponieważ wartości x zmieniane są w dwóch krokach. Następnie elementy w x są ustawiane jako równe nowym wartościom na podstawie oryginalnych wartości, które są w y. Ostatni wynik wyświetlony jest matryca. Oto przykład:

> x = matrix(1:10,2,5)

> x

[,1] [,2] [,3] [,4] [,5]

[1,] 1 3 5 7 9

[2,] 2 4 6 8 10

> y=x

> x[y>5] = 1

> x[y<=5] = 0

> x

[,1] [,2] [,3] [,4] [,5]

[1,] 0 0 0 1 1

[2,] 0 0 1 1 1

Na moim komputerze, przy użyciu macierzy z 43 830 wierszami i 35 kolumnami, metoda zapętlania zajęła około pięciu sekund, a metoda indeksowania mniej niż sekundę