Supposons que j'ai les objets zoo suivants :

fmt <- "%m/%d/%Y"
df1 <- data.frame(date=c('1/11/1999', '2/5/1999', '3/8/1999','4/5/1999','6/11/1999'), v1=c(1,2,3,4,5), v2=c(10,9,8,7,6))
df1$date <- as.Date(df1$date, format = fmt)
df1.zoo <- read.zoo(df1)

df2 <- data.frame(date=c('1/11/1999', '2/8/1999', '3/8/1999','4/5/1999','6/15/1999'), v1=c(1,2,3,4,5), v2=c(11,8,5,3,2))
df2$date <- as.Date(df2$date, format = fmt)
df2.zoo <- read.zoo(df2)

...

Je voudrais utiliser quelque chose comme Réduire (...) pour avoir PAR JOUR :

  1. somme des valeurs correspondantes dans v1 et
  2. diff des valeurs correspondantes dans v2.

Donc, la sortie que j'attendrais ici est:

dt       |     v1     |      v2
'1/11/1999'    2             -1
'2/5/1999'     2             9
'2/8/1999'     2             -8
...

REMARQUE : je préférerais une solution utilisant zoo ou base R.

1
Denis 24 févr. 2020 à 19:17

1 réponse

Meilleure réponse

J'espère que je vous ai bien compris, vous définissez une fonction qui prend en charge 2 variables, et Reduce travaillera là-dessus :

matrix_function=function(x,y)cbind(v1=x[,1]+y[,1],v2=x[,2]-y[,2])

library(zoo)
Reduce(matrix_function,list(df1.zoo,df2.zoo))

           v1 v2
1999-01-11  2 -1
1999-03-08  6  3
1999-04-05  8  4

Nous l'essayons sur 1000 dataframes, nous avons d'abord une matrice avec 1000 colonnes et 5 valeurs de lignes seront prises par chaque data.frame de la liste :

set.seed(100)
v1_matrix = matrix(runif(5000),nrow=5)
v2_matrix = matrix(runif(5000),nrow=5)

list_of_df = lapply(1:1000,function(i){
  fmt <- "%m/%d/%Y"
  df <- data.frame(
  date=c('1/11/1999', '2/5/1999', '3/8/1999','4/5/1999','6/11/1999'), 
  v1=v1_matrix[,i], v2=v2_matrix[,i])
  df$date <- as.Date(df$date, format = fmt)
  df.zoo <- read.zoo(df)
  df.zoo
})

Nous appliquons la fonction et Réduire :

res=Reduce(matrix_function,list_of_df)

La première colonne doit être le rowSums de la première matrice :

res[,1] == rowSums(v1_matrix)
1999-01-11 1999-02-05 1999-03-08 1999-04-05 1999-06-11 
      TRUE       TRUE       TRUE       TRUE       TRUE

La deuxième colonne doit être la première colonne de la 2e matrice, en soustrayant la somme de la colonne restante :

res[,2] == v2_matrix[,1]-rowSums(v2_matrix[,-1])
1999-01-11 1999-02-05 1999-03-08 1999-04-05 1999-06-11 
      TRUE       TRUE       TRUE       TRUE       TRUE 
1
StupidWolf 24 févr. 2020 à 21:41