2017-03-19 2 views

Répondre

1

Cela semble légèrement plus délicat à faire que sur un data.frame standard. Une façon de procéder consiste à extraire les colonnes de données que vous souhaitez modifier en un nom de données standard. Modifiez-les ensuite de la manière habituelle en utilisant le sous-ensemble et l'affectation data.frame - voir here.

Ainsi, par exemple, en changeant des zéros entiers dans NA dans les colonnes 5: 8 nous pouvons le faire:

df = as.data.frame(l8.stations)[, 5:8]  # extract desired columns into a data.frame 
df[df == 0] = NA        # change values that are zero into NA 
l8.stations[1:NROW(l8.stations), 5:8] = df # insert result back into spatial points data frame 

Maintenant, vous avez mentionné faire la même chose pour les valeurs de 0,0. Dans ce cas traitant du nombre réel plutôt que des entiers, nous devrions vraiment tester non pas l'égalité à zéro, mais que la valeur est plus petite qu'un certain seuil de petit nombre. Pour comprendre pourquoi nous faisons cela avec des nombres réels, plutôt que simplement tester, ils sont égaux à zéro, lire this. Ainsi, par exemple d'utiliser la coupure comme eps = 1e-10 nous pouvons faire la même chose que ci-dessus mais pour tester des valeurs inférieures à eps:

df = as.data.frame(l8.stations)[, 5:8] 
df[abs(df) < eps] = NA  
l8.stations[1:NROW(l8.stations), 5:8] = df 

Certaines données factices reproductibles pour tester sur:

library(sp) 

set.seed(1331) 
pts = cbind(1:5, 1:5) 
dimnames(pts)[[1]] = letters[1:5] 

df = data.frame(sample(0:3, 5, T), 
       sample(0:3, 5, T), 
       sample(0:3, 5, T), 
       sample(0:3, 5, T), 
       sample(0:3, 5, T), 
       sample(0:3, 5, T), 
       sample(0:3, 5, T), 
       sample(0:3, 5, T)) 

row.names(df) = letters[1:5] 
colnames(df) = LETTERS[1:8] 
l8.stations = SpatialPointsDataFrame(pts, df)