我如何减少不同的方向?

How do I Reduce in different directions?

假设我有以下动物园对象:

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)

...

我想使用 Reduce(...) 之类的东西让 PER DAY:

  1. v1 和
  2. 中相应值的总和
  3. v2 中相应值的差异。

所以我期望的输出是:

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

NOTE: I would prefer a solution using zoo or base R.

希望我没听错,你定义了一个接受 2 个变量的函数,Reduce 将处理它:

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

我们在 1000 个数据帧上尝试,首先我们有一个包含 1000 列的矩阵,列表中的每个 data.frame 将采用 5 行值:

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
})

我们应用函数并减少:

res=Reduce(matrix_function,list_of_df)

第一列应该是第一个矩阵的rowSums:

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

第二列应该是第二个矩阵的第一列,减去剩余列的总和:

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