我如何减少不同的方向?
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:
- v1 和
中相应值的总和
- 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
假设我有以下动物园对象:
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:
- v1 和 中相应值的总和
- 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