2016-06-15 3 views
0

Ich habe zwei Matrizen, PT1 und PT2, mit der Probe unter vermeiden:R Betrieb auf Matrizen mit, wenn NaN Warnung

pt1[1,] = 9.819 1.839 1.542 1.236 1.137 0.774 0.774 0.608 0.527 0.327 0.324 0.245 0.133 0.111 0.110 0.067 0.038 0.018 0.007 0.002 0.000 0.000 
pt2[1,] = 9.9770359 1.8361173 1.6109915 1.2507719 1.0475069 0.7834792 0.7832150 0.6610241 0.5318586 0.3857874 0.3084728 0.2700538 0.1439364 0.1220980 0.1056596 0.0679037 0.0373881 0.0220959 0.0068046 0.0018711 0.0000000 0.0000000 

Ich muss Protokollbetrieb so durchführen:

rt2 <- log(pt2/pt1)*0.5 

Wie erwartet, werden jedoch die letzten beiden Werte NaN erzeugen, da die pt1-Werte Null sind (Division durch Null). Dass eine Warnung zeigte:

Warning message: 
In log(pt2/pt1) : NaNs produced 

I ifelse verwendet, das zu korrigieren (und es erwartet, dass die Warnung zu entfernen):

r2 <- ifelse(pt1==0 | pt2==0, 0, log(pt2/pt1)*0.5) 

Die NaN sind nicht mehr produziert, aber die Warnung noch gezeigt.

Was soll ich tun, um die Warnung zu vermeiden?

Vielen Dank!

Antwort

0

Hier ist eine Methode, mit Subskribierung:

# get vector of proper length 
r2 <- numeric(length(pt1)) 
# get logical vector of same length for fill in indicator 
fillins <- pt1 != 0 & pt2 != 0 
# fill in values 
r2[fillins] <- log(pt2[fillins]/pt1[fillins]) * 0.5 
0

Sie suppressWarnings() verwenden können:

pt1 <- matrix(rnorm(2200), nrow = 100) 
pt2 <- matrix(rnorm(2200), nrow = 100) 
rt2 <- suppressWarnings(log(pt2/pt1)*0.5) 
head(rt2[,1:5],2) 
      [,1]  [,2] [,3]  [,4] [,5] 
[1,] -0.1209207 0.8211299 NaN -0.3271424 NaN 
[2,] -0.3916372  NaN NaN  NaN 1.1085 

rt2[is.na(rt2)] <- 0 
head(rt2[,1:5],2) 
      [,1]  [,2] [,3]  [,4] [,5] 
[1,] -0.1209207 0.8211299 0 -0.3271424 0.0000 
[2,] -0.3916372 0.0000000 0 0.0000000 1.1085 

Ich hoffe, das hilft.