2017-02-21 1 views
0

je les données suivantesSuppression des zéros et les réintégrant dans les séries chronologiques

library(xts) 
values<-c(2,2,2,4,2,3,0,0,0,0,0,1,2,3,2) 
time1<-seq(from=as.POSIXct("2013-01-01 00:00"),to=as.POSIXct("2013-01-1 14:00"),by="hour") 
data<-xts(values,order.by=time1) 
data 

    [,1] 
2013-01-01 00:00:00 2 
2013-01-01 01:00:00 2 
2013-01-01 02:00:00 2 
2013-01-01 03:00:00 4 
2013-01-01 04:00:00 2 
2013-01-01 05:00:00 3 
2013-01-01 06:00:00 0 
2013-01-01 07:00:00 0 
2013-01-01 08:00:00 0 
2013-01-01 09:00:00 0 
2013-01-01 10:00:00 0 
2013-01-01 11:00:00 1 
2013-01-01 12:00:00 2 
2013-01-01 13:00:00 3 
2013-01-01 14:00:00 2 

Maintenant, je veux supprimer tous les zéros, cela peut être facilement atteint avec

remove_zerro = apply(data, 1, function(row) all(row !=0)) 
data[remove_zerro,] 

Le problème est que après avoir utilisé les données sans zéros et apporté quelques modifications, je souhaite réinsérer les zéros dans mes données à la même date et heure. N'importe quelle idée serait apprecciated

+0

Séparez vos données avec et sans zéro, puis les remettre ensemble, ou font des "modifications" sur le sous-ensemble de données '[données [1] = 0,!] zx8754

Répondre

1

Il semble que vous pourriez vouloir travailler avec rares vecteurs/matrices:

install.packages("spam") 
library(spam) 
sx <- c(0,0,3, 3.2, 0,0,0,-3:1,0,0,2,0,0,5,0,0) 
apply.spam(spam(sx), NULL, function(x){1/x}) 
      [,1] 
[1,] 0.0000000 
[2,] 0.0000000 
[3,] 0.3333333 
[4,] 0.3125000 
[5,] 0.0000000 
[6,] 0.0000000 
[7,] 0.0000000 
[8,] -0.3333333 
[9,] -0.5000000 
[10,] -1.0000000 
[11,] 0.0000000 
[12,] 1.0000000 
[13,] 0.0000000 
[14,] 0.0000000 
[15,] 0.5000000 
[16,] 0.0000000 
[17,] 0.0000000 
[18,] 0.2000000 
[19,] 0.0000000 
[20,] 0.0000000 

Si vous l'avez fait avec zéro valeurs:

> apply(matrix(sx), 1, function(x){1/x}) 
[1]  Inf  Inf 0.3333333 0.3125000  Inf  Inf 
[7]  Inf -0.3333333 -0.5000000 -1.0000000  Inf 1.0000000 
[13]  Inf  Inf 0.5000000  Inf  Inf 0.2000000 
[19]  Inf  Inf 

vous pouvez donc voir que apply.spam ne tient pas compte des zéros, mais les remet automatiquement

L'inconvénient est que vous aurez à rattachez de temps étiquettes après le traitement.

0

Je construis sur le commentaire de @ zx8754.

Une manière consiste à diviser la trame de données. Si vous vous souciez de jouer avec les index ou de joindre les trames de données ensemble, alors voici une autre approche.

Créer un index de T/F.

idx <- df[,col] != 0 
df$col[idx] <- 2007 # or whatever operation. 
1

Voici deux approches possibles:

# re-create your data set 
library(xts) 
values<-c(2,2,2,4,2,3,0,0,0,0,0,1,2,3,2) 
time1<-seq(from=as.POSIXct("2013-01-01 00:00"),to=as.POSIXct("2013-01-1 14:00"),by="hour") 
data<-xts(values,order.by=time1) 
data 

############################################### 
# SOLUTION 1 : 
# make a union of the "zero" series and the "zero-free" series 

# create a copy of data with no zero 
isNotZero = apply(data, 1, function(row) all(row != 0)) 
zeroFreeSeries <- data[isNotZero,] 
zeroSeries <- data[!isNotZero,] 

# do you calculations on the "zero-free" series (e.g. add 10 to all values) 
zeroFreeSeries <- zeroFreeSeries + 10 

# union 
unionSeries <- rbind(zeroSeries,zeroFreeSeries) 

# now unionSeries contains what you desire 
unionSeries 

############################################### 
# SOLUTION 2 : 
# keep the original series copy and after doing your operations 
# on the "zero-free" series, update the original series copy with 
# with the new values (it doesn't work well if you remove some date from the 
# zero-free series) 

# create a copy of data with no zero 
isNotZero = apply(data, 1, function(row) all(row != 0)) 
zeroFreeSeries <- data[isNotZero,] 

# do you operations on the "zero-free" series (e.g. add 10 to all values) 
zeroFreeSeries <- zeroFreeSeries + 10 

# modify the original data by setting the new values 
data[time(zeroFreeSeries),] <- zeroFreeSeries 

# now data contains what you desire 
data 
+0

La solution 2 est exactement ce que je cherchais – kelamahim

0

Alors, évidemment, c'est la solution

no<-data[ data[,1] != 0, ] #data without zeros 
yes<-data[ data[,1] == 0, ]# data with only zeros 

together<-c(no, yes)# both data combined together