To Wprowadzenie nie byłoby kompletna bez porad na temat niektórych trudnych fragmentów R. Gdy wydaje się, że wszystko jest dobrze skonfigurowane, ale rzeczy nadal nie działają zgodnie z oczekiwaniami i nie wiesz dlaczego, ta sekcja może pomóc. Opisano tu również niektóre nieoczywiste części R.
Podstawienie wartości: NA, NaN, Inf i -Inf
Ta sekcja dotyczy brakujących danych (NA) lub niedozwolonych elementów (NaN, Inf lub -Inf). Załóżmy, że chcesz zastąpić brakujące wartości jakąś wartość, na przykład 0. Intuicyjnym podejściem byłoby wpisanie czegoś takiego jak:
mat [mat == NA] = 0
To nie działa. Co działa, to wprowadzenie następujących danych:
mat [is.na (mat)] = 0
Na przykład:
> mat = matrix (c (1, NA, 3,4), 2,2)
> mat
[, 1] [, 2]
[1,] 1 3
[2,] NA 4
> mata [mat == NA] = 2
> mat
[, 1] [, 2]
[1,] 1 3
[2,] NA 4
> mat [is.na (mat)] = 2
> mat
[, 1] [, 2]
[1,] 1 3
[2,] 2 4
Ta sama metoda działa w przypadku niedozwolonych wartości. Wartości NaN, Inf i -Inf są zdefiniowane w R dla nielegalnych operacji. Na przykład:
> 1/0
[1] Inf
> -1/0
[1] -Inf
> 0/0
[1] NaN
> log (-1)
[1] NaN
Wiadomość ostrzegawcza:
W logu (-1): wyprodukowane NaNs
W tym przykładzie podzielenie liczby dodatniej przez zero daje plus nieskończoność; podzielenie liczby ujemnej przez zero daje nieskończoność ujemną; dzielenie zera przez zero nie jest zdefiniowane, więc zwracana jest wartość NaN. Próba znalezienia logarytmu minus jeden zwraca NaN z ostrzeżeniem, ponieważ logarytm minus jeden nie jest zdefiniowany. Funkcje is.finite (), is.infinite () i is.nan () zajmują miejsce is.na () w testach elementów skończonych, Inf i -Inf oraz NaN. Na przykład:
> mat = matrix (c (1, NaN, Inf, -Inf), 2,2)
> mat
[, 1] [, 2]
[1,] 1 Inf
[2,] NaN -Inf
> mat [is.finite (mat)] = 2
> mat
[, 1] [, 2]
[1,] 2 Inf
[2,] NaN -Inf
> mat [is.infinite (mat)] = 3
> mat
[, 1] [, 2]
[1,] 2 3
[2,] NaN3
> mat [is.nan (mat)] = 4
> mat
[, 1] [, 2]
[1,] 2 3
[2,] 4 3
Zauważ, że is.infinite () traktuje Inf i -Inf tak samo. Funkcja sign () zwraca -1 dla argumentu równego -Inf. W rezultacie prostym sposobem rozwiązania problemu ze znakiem jest najpierw pobranie znaku obiektu, a następnie pomnożenie wartości bezwzględnej obiektu wynikającej z podstawienia przez obiekt znaku po przypisaniu liczby do -Inf. Na przykład:
> mat=matrix(c(1,2,Inf,-Inf),2,2)
> mat
[,1] [,2]
[1,] 1 Inf
[2,] 2 -Inf
> sg.mat = sign(mat)
> sg.mat
[,1] [,2]
[1,] 1 1
[2,] 1 -1
> mat[is.infinite(mat)] = 4
> mat
[,1] [,2]
[1,] 1 4
[2,] 2 4
> mat = sg.mat*abs(mat)
> mat
[,1] [,2]
[1,] 1 4
[2,] 2 -4
Więcej informacji na temat NA i is.na () można znaleźć, wpisując ?is.na w wierszu polecenia R. Więcej informacji o NaN, Inf, -Inf, is.nan (), is.finite () i is.infinite () można znaleźć, wpisując?is.finite po znaku zachęty R.