es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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, /)
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Puedes usar la función split() para dividir los marcos de datos int1 e int2 en dos marcos de datos separados para ID A y ID B. Luego, puedes usar la función map2() para aplicar la función f2 a cada uno de los marcos de datos por separado. Esto resultará en dos matrices separadas para ID A y ID B.

Comments are closed.