/ / matrix inside data.frame en R u otra estructura anidada - r, matriz multidimensional, marco de datos, distancia, knn

matriz dentro de data.frame en R u otra estructura anidada - r, matriz multidimensional, trama de datos, distancia, knn

Necesito construir una estructura de datos en R que contenga un matrix (o data.frame) para cada observación. Idealmente, sería un matrix dentro de una data.frame. Hasta el momento, solo puedo pensar en listas anidadas para lograrlo, pero luego tengo miedo de tener un bajo rendimiento.

Por ejemplo, para el elemento data.frame

df <- data.frame(start=c("A", "B", "C"), end=c("A", "B", "C"))

Me gustaría agregar una columna que contenga una matriz en cada celda (resultante de la función de distancia). Por ejemplo, para el elemento start == "A", end == "B" podría ser la matriz (o data.frame)

haversineStart haversineEnd tripLengthDiff startCountry endCountry truckDiff
160.5408     308.1947        198.745            1          1         1
152.4168     308.1947         20.710            1          1         1
273.7599    2228.3508       2903.212            0          1         1

Teóricamente, solo sería una especie de estructura de datos 3D. En Python, sería una lista de listas que contienen una NumPy-formación. ¿Es algo así posible en R?

Fondo

Quiero realizar knn con una función de distancia personalizada y necesito normalizar las distancias antes de realizar la función knn

Respuestas

1 para la respuesta № 1

Si ya tienes lista anidada:

d <- list(
a = list(matrix(rnorm(4), 2, 2), matrix(rnorm(4), 2, 2), matrix(rnorm(4), 2, 2)),
b = list(matrix(rnorm(4), 2, 2), matrix(rnorm(4), 2, 2), matrix(rnorm(4), 2, 2))
)

puede convertirlo en data.frame fácilmente, ya que data.frame sigue en la lista:

class(d) <- "data.frame"
colnames(d) <- c("A", "B")
rownames(d) <- c("A", "B", "C")

d["A", "B"]

# [[1]]
#            [,1]       [,2]
# [1,] -0.6326935 -1.1181986
# [2,] -1.3066515  0.6672159

1 para la respuesta № 2

Simplemente asigne una lista de matrices a una nueva columna en el data.frame. Por ejemplo, suponiendo df de la pregunta:

m <- matrix(c(1, 12, 3, 14), 2)
df$mat <- list(m, 2*m, 3*m) # test list

asi que

> df$mat[[1]]
[,1] [,2]
[1,]    1    3
[2,]   12   14

> df[[1, "mat"]]
[,1] [,2]
[1,]    1    3
[2,]   12   14

> transform(df, det = sapply(mat, det))
start end          mat  det
1     A   A 1, 12, 3, 14  -22
2     B   B 2, 24, 6, 28  -88
3     C   C 3, 36, 9, 42 -198