Как мне уменьшить в разных направлениях? - PullRequest
1 голос
/ 24 февраля 2020

Предположим, у меня есть следующие объекты зоопарка:

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. diff соответствующих значений в v2.

Итак, результат, который я ожидал бы получить здесь:

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

ПРИМЕЧАНИЕ. Я бы предпочел решение с использованием зоопарка или базы R.

1 Ответ

1 голос
/ 24 февраля 2020

Надеюсь, я вас правильно понял, вы определили функцию, которая принимает 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 столбцами и 5 значений строки будут взяты каждым data.frame в списке:

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)

Первый столбец должен быть строкой Суммы первая матрица:

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

Второй столбец должен быть первым столбцом 2-й матрицы, вычитая сумму оставшегося столбца:

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...