Arreglando matrices desiguales.
Tengo un conjunto de datos df que se ha dividido en int1 e int2. En int1 e int2, hay dos elementos para IDA y tres elementos para IDB.
Mi objetivo es crear una matriz de 2×2 para IDA y 3×3 para IDB, y que se divida de mi lista de matrices de ejemplo l1. Actualmente, mi código está creando una matriz de 3×3 para IDA y una matriz de 2×2 para IDB utilizando una combinación del producto de g1 y f2 usando map2 (), lo que resulta en lstmat.
¿Algún comentario sobre cómo puedo obtener la salida deseada de una matriz de 2×2 para IDA y una matriz de 3×3 para IDB?
Datos de ejemplo:
library(lubridate)
library(tidyverse)
fecha <- rep_len(seq(dmy("26-12-2010"), dmy("20-12-2011"), by = "days"), 500)
ID <- rep(c("A","B"), 5000)
df <- data.frame(fecha = fecha,
x = runif(length(fecha), min = 60000, max = 80000),
y = runif(length(fecha), min = 800000, max = 900000),
ID)
df$jFecha <- julian(as.Date(df$fecha), origin = as.Date('1970-01-01'))
df$Mes <- month(df$fecha)
df$anno <- year(df$fecha)
t1 <- c(100,150)
t2 <- c(200,250)
mat <- cbind(t1,t2)
t1 <- c(150,150,200)
t2 <- c(250,250,350)
t3 <- c(350,350, 400)
mat2 <- cbind(t1,t2, t3)
l1 <- list(mat, mat2)
int1 <- df %>%
# arrange(ID) %>% # Se omite para mejorar la legibilidad del resultado
mutate(new = floordate(fecha, '10 day')) %>%
mutate(new = ifelse(day(new) == 31, new - days(10), new)) %>%
groupby(ID, new) %>%
filter(Mes == "3") %>%
groupsplit()
int2 <- df %>%
# arrange(ID) %>% # Se omite para mejorar la legibilidad del resultado
mutate(new = floordate(fecha, '10 day')) %>%
mutate(new = ifelse(day(new) == 31, new - days(10), new)) %>%
groupby(ID, new) %>%
filter(Mes == "2") %>%
groupsplit()
names(int1) <- sapply(int1, function(x) paste(x$ID[1],
sep = ''))
names(int2) <- sapply(int2, function(x) paste(x$ID[1],
sep = ''))
int1 <- int1[-1]
int2 <- int2[-1]
¿Algún comentario sobre los cambios que se deben realizar en este código para obtener el resultado deseado?:
g1 <- as.integer(gl(length(int1), 3, length(int1)))
f2 <- function(.int1, .int2) {
t(outer(seq_along(.int1), seq_along(.int2),
FUN = Vectorize(function(i, j) min(.int1[[i]]$jFecha) -
min(.int2[[j]]$jFecha))))
}
lstMat <- map2(split(int1, g1), split(int2, g1), f2)
map2(l1, lstMat, /)
davy.ai
Puedes usar la función
split()
para dividir los marcos de datosint1
eint2
en dos marcos de datos separados paraID
A yID
B. Luego, puedes usar la funciónmap2()
para aplicar la funciónf2
a cada uno de los marcos de datos por separado. Esto resultará en dos matrices separadas paraID
A yID
B.